我想使用dplyr mutate_at函数将函数应用于数据框中的多个列,其中函数输入直接应用的列以及数据帧中的另一列.
作为一个具体的例子,我想改变以下数据帧
# Example input dataframe
df <- data.frame(
x = c(TRUE, TRUE, FALSE),
y = c("Hello", "Hola", "Ciao"),
z = c("World", "ao", "HaOlam")
)
Run Code Online (Sandbox Code Playgroud)
与mutate_at调用类似于此
df %>%
mutate_at(.vars = vars(y, z),
.funs = ifelse(x, ., NA))
Run Code Online (Sandbox Code Playgroud)
返回一个看起来像这样的数据框
# Desired output dataframe
df2 <- data.frame(x = c(TRUE, TRUE, FALSE),
y_1 = c("Hello", "Hola", NA),
z_1 = c("World", "ao", NA))
Run Code Online (Sandbox Code Playgroud)
所需的mutate_at呼叫类似于以下呼叫mutate:
df %>%
mutate(y_1 = ifelse(x, y, NA),
z_1 = ifelse(x, z, NA))
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过几种方式在base R中完成,但我特别希望使用dplyr mutate_at函数来实现这个目标,以便于读取,与数据库连接等.
下面是一些在stackoverflow上提出的类似问题,这些问题没有解决我在这里提出的问题:
bsc*_*idr 54
@ eipi10在@ eipi10对这个问题的评论中回答了这个问题,但我在这里写的是后人.
这里的解决方案是使用:
df %>%
mutate_at(.vars = vars(y, z),
.funs = list(~ ifelse(x, ., NA)))
Run Code Online (Sandbox Code Playgroud)
list(~ ...)这里的使用表明这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)
Run Code Online (Sandbox Code Playgroud)
要补充之前的响应,如果要mutate_at()添加新变量(而不是替换),使用原始问题中的名称z_1和y_1原始问题,则只需在funs(newname= ...)调用中添加名称:
df %>%
mutate_at(.vars = vars(y, z),
.funs = funs(`1`=ifelse(x, ., NA)))
Run Code Online (Sandbox Code Playgroud)
这给出了:
# 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
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息和技巧,请参阅:使用mutate_at创建新变量,同时保留原始变量
| 归档时间: |
|
| 查看次数: |
39807 次 |
| 最近记录: |