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

时间:2016-08-29 15:32:28

标签: 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")
                 )

使用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

2 个答案:

答案 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_1y_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