如果可能的话,我想用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
之类的自定义函数。
答案 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