我想使用magrittr和dplyr的简洁性,根据其他列中的值在列子集中的行之间复制单个值。这是一个简单的例子;我想将此思想应用于大型数据集的许多列,这些列在长命令中具有多个条件。
以数据框df <- data.frame(a = 1:5, b = 6:10, x = 11:15, y = 16:20)
:
a b x y
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
5 10 15 20
对于
a = 5
所在的行,我想将x
和y
的值替换为b = 7
所在行的值,以得到:a b x y
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
5 10 12 17
此尝试失败:
foo <- function(x){ifelse(df$a == 5, df[df$b == 7, .(df$x)], x)}
df %<>% mutate_each(funs(foo), x, y)
我能得到的最接近的是:
bar <- function(x){ifelse(df$a == 5, df[df$b == 7, "x"], x)}
df %<>% mutate_each(funs(bar), x, y)
但这是不正确的,因为它将两个值都替换为
x
中的值,而不是分别用x
和y
替换。谢谢你的建议。
最佳答案
您可以使用mutate_each
和replace
来做到这一点:
df %>% mutate_each(funs(replace(., a==5, nth(., which(b==7)))), x, y)
输出:
a b x y
1 1 6 11 16
2 2 7 12 17
3 3 8 13 18
4 4 9 14 19
5 5 10 12 17
或按照@docendodiscimus的注释,它可以进一步缩短为(可能
[
也比which
好):df %>% mutate_each(funs(replace(., a==5, .[b==7])), x, y)
关于r - R中带有magrittr和dplyr的条件数据框突变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34160769/