使用mutate_at和lst()而不是funs()来保留列名

时间:2019-06-01 21:30:58

标签: r dplyr

在dplyr 0.8.0中,funs()已过时,新格式是将list()~一起使用。但是,我注意到,这不再像以前预期的那样使用mutate_at()更新列。

> set.seed(5)
> testdf <- data.frame(a = sample(1:9, size = 5, replace = TRUE),
+                      b = 1:5,
+                      c = LETTERS[1:5])
> testdf
  a b c
1 2 1 A
2 7 2 B
3 9 3 C
4 3 4 D
5 1 5 E

旧代码示例:

> testdf %>% mutate_at(.vars = c('a','b'), .funs = funs(. + 2))
   a b c
1  4 3 A
2  9 4 B
3 11 5 C
4  5 6 D
5  3 7 E

新代码示例:

> testdf %>% mutate_at(.vars = c('a','b'), .funs = lst(~. + 2))
  a b c a_~. + 2 b_~. + 2
1 2 1 A        4        3
2 7 2 B        9        4
3 9 3 C       11        5
4 3 4 D        5        6
5 1 5 E        3        7

编辑:我刚刚注意到,如果我使用list(),此问题将得到解决:

> testdf %>% mutate_at(.vars = c('a','b'), .funs = list(~. + 2))
   a b c
1  4 3 A
2  9 4 B
3 11 5 C
4  5 6 D
5  3 7 E

但是,我希望使用lst(),因为在我的代码中,我经常需要使用!!!取消对变量的引用,list()不支持该变量(请参见here

我不确定在保留名称的同时使用lst()的正确方法。

1 个答案:

答案 0 :(得分:3)

rlang::list2

  

等同于list(...),但提供了整洁的点语义:

>  testdf %>% mutate_at(.vars = c('a','b'), .funs = rlang::list2(~. + 2))
   a b c
1  4 3 A
2  9 4 B
3 11 5 C
4  5 6 D
5  3 7 E