df <- data.frame(x=1:10)
我可以根据一个条件改变几个列吗?
例如,我可以这样做:
df %>% mutate(y = if_else(x>3,"Y","N"), z = if_else(x>3,"YY","NN"))
但由于情况是一样的(x>3
),我想知道是否有其他方法可以不必重复.
df <- data.frame(x=1:10)
我可以根据一个条件改变几个列吗?
例如,我可以这样做:
df %>% mutate(y = if_else(x>3,"Y","N"), z = if_else(x>3,"YY","NN"))
但由于情况是一样的(x>3
),我想知道是否有其他方法可以不必重复.
感谢来自@thelatmail的 comments ,以下是您感兴趣的方法
df[c("y","z")] <- lapply(list(c("Y","N"), c("YY","NN")), \(x) ifelse(df$x > 3, x[1], x[2]) )
也许你可以试一试
cbind(
df,
`row.names<-`(data.frame(
y = c("N", "Y"),
z = c("NN", "YY")
)[(df$x > 3) + 1, ], NULL)
)
或者dplyr
版
df %>%
cbind({
data.frame(
y = c("N", "Y"),
z = c("NN", "YY")
)[((.)$x > 3) + 1, ]
}) %>%
`row.names<-`(NULL)
这给了我们
x y z
1 1 N NN
2 2 N NN
3 3 N NN
4 4 Y YY
5 5 Y YY
6 6 Y YY
7 7 Y YY
8 8 Y YY
9 9 Y YY
10 10 Y YY
或者,像这样使用ifelse
如何(但这样效率很低,我不建议这样做).
cbind(
df,
with(
df,
do.call(
rbind,
ifelse(x > 3,
list(data.frame(y = "Y", z = "YY")),
list(data.frame(y = "N", z = "NN"))
)
)
)
)
这给了我们
x y z
1 1 N NN
2 2 N NN
3 3 N NN
4 4 Y YY
5 5 Y YY
6 6 Y YY
7 7 Y YY
8 8 Y YY
9 9 Y YY
10 10 Y YY