我想使用dplyr的mutate_at
函数将函数应用于数据框中的多个列,其中函数输入直接应用的列以及数据框中的另一列。
作为一个具体的例子,我希望改变以下数据框
# Example input dataframe
df <- data_frame(x = c(TRUE, TRUE, FALSE),
y = c("Hello", "Hola", "Ciao"),
z = c("World", "ao", "HaOlam")
)
使用mutate_at
调用看起来类似于此
df %>%
mutate_at(.vars = vars(y, z),
.funs = ifelse(x, ., NA)
)
返回类似于此内容的数据框
# Desired output dataframe
df2 <- data_frame(x = c(TRUE, TRUE, FALSE),
y_1 = c("Hello", "Hola", NA),
z_1 = c("World", "ao", NA)
)
所需的mutate_at
来电与以下对mutate
的调用类似:
df %>%
mutate(y_1 = ifelse(x, y, NA),
z_1 = ifelse(x, z, NA)
)
我知道这可以通过几种方式在基础R中完成,但我特别希望使用dplyr的mutate_at
函数来实现这个目标,以便于阅读,与数据库连接等。
以下是有关stackoverflow的一些类似问题,没有解决我在这里提出的问题:
adding multiple columns in a dplyr mutate call
dplyr::mutate to add multiple values
Use of column inside sum() function using dplyr's mutate() function
答案 0 :(得分:48)
@ eipi10在@ eipi10对这个问题的评论中回答了这个问题,但我是在这里写给后人的。
这里的解决方案是使用:
df %>%
mutate_at(.vars = vars(y, z),
.funs = funs(ifelse(x, ., NA)))
此处使用funs()
表示ifelse(x, ., NA)
是在mutate_at()
调用中定义的匿名函数。
这类似于定义mutate_at()
调用之外的函数,如下所示:
temp_fn <- function(input) ifelse(test = df[["x"]],
yes = input,
no = NA)
df %>%
mutate_at(.vars = vars(y, z),
.funs = temp_fn)
答案 1 :(得分:8)
要补充先前的回答,如果您想mutate_at()
添加新变量(而不是替换变量),并使用诸如原始问题中的z_1
和y_1
之类的名称,需要在funs(newname= ...)
调用中添加名称:
df %>%
mutate_at(.vars = vars(y, z),
.funs = funs(`1`=ifelse(x, ., NA)))
这给出了:
# A tibble: 3 x 5
x y z y_1 z_1
<lgl> <chr> <chr> <chr> <chr>
1 TRUE Hello World Hello World
2 TRUE Hola ao Hola ao
3 FALSE Ciao HaOlam NA NA
有关更多详细信息和技巧,请参阅:Create new variables with mutate_at while keeping the original ones