使用dplyr

时间:2016-07-28 21:42:06

标签: r dplyr

如果可能的话,我想用dplyr复制以下行为。

我正在做的事情非常简单:我有许多具有一定基线水平的因素,我想将它们简化为0/1变量。

如果我模拟这样的数据集:

df <- data.frame(id = 1:100,
                 x = factor(sample(c("a", "b", "c"), 100, T)),
                 y = factor(sample(c("a", "b", "c"), 100, T)))

然后我可以很容易地实现这一点:

fn <- function(x) {
  ifelse(x == "c", 0, 1)
}

df[c("x", "y")] <- apply(df[c("x", "y")], 2, fn) 
df

然而在dplyr这似乎打败了我。我正在考虑使用mutate_which,但我似乎无法使用fn之类的自定义函数。

1 个答案:

答案 0 :(得分:1)

Psidon发布的答案,

df %>% mutate(x = fn(x), y = fn(y))

是正确的,但不容易推广。

StevenBeaupré提出的答案更为普遍:

df %>% mutate_at(vars(x:y), funs(if_else(. == "c", 0, 1)))

或更透明的版本,

df %>% mutate_at(.funs = function(x) {ifelse(x == "c", 0, 1)}, .cols = vars(x:y))

我的主要问题是,这与mutate_each无法合作,似乎已被淘汰:

df %>% mutate_each(funs = function(x) {ifelse(x == "c", 0, 1)}, cols = vars(x, y))
Error: is.fun_list(calls) is not TRUE