在dplyr mutate_at调用中使用多个列的函数

bsc*_*idr 47 r dplyr

我想使用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上提出的类似问题,这些问题没有解决我在这里提出的问题:

在dplyr mutate调用中添加多个列

dplyr :: mutate添加多个值

使用dplyr的mutate()函数在sum()函数内部使用列

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)


Mat*_*fou 8

要补充之前的响应,如果要mutate_at()添加新变量(而不是替换),使用原始问题中的名称z_1y_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创建新变量,同时保留原始变量