在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()
的正确方法。
答案 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