我正在使用summarizeR 中 dplyr 包中的函数从表中总结组均值。我想使用存储在另一个变量中的列名字符串动态执行此操作。
以下是“正常”方式,当然可以工作:
myTibble <- group_by( iris, Species)
summarise( myTibble, avg = mean( Sepal.Length))
# A tibble: 3 x 2
Species avg
<fct> <dbl>
1 setosa 5.01
2 versicolor 5.94
3 virginica 6.59
Run Code Online (Sandbox Code Playgroud)
但是,我想做这样的事情:
myTibble <- group_by( iris, Species)
colOfInterest <- "Sepal.Length"
summarise( myTibble, avg = mean( colOfInterest))
Run Code Online (Sandbox Code Playgroud)
我读过与dplyr编程页,我已经尝试了一堆的组合quo,enquo,!!,.dots=(...),等,但我还没有想出这样做还以正确的方式。
我也知道这个答案,但是,1) 当我使用标准评估函数时standardise_,R 告诉我它已经贬值了,2) 这个答案看起来一点也不优雅。那么,有没有一种好的,简单的方法来做到这一点?
谢谢!
1)!!sym(...)像这样使用:
colOfInterest <- "Sepal.Length"
iris %>%
group_by(Species) %>%
summarize(avg = mean(!!sym(colOfInterest))) %>%
ungroup
Run Code Online (Sandbox Code Playgroud)
给予:
# A tibble: 3 x 2
Species avg
<fct> <dbl>
1 setosa 5.01
2 versicolor 5.94
3 virginica 6.59
Run Code Online (Sandbox Code Playgroud)
2)第二种方法是:
colOfInterest <- "Sepal.Length"
iris %>%
group_by(Species) %>%
summarize(avg = mean(.data[[colOfInterest]])) %>%
ungroup
Run Code Online (Sandbox Code Playgroud)
当然,这在基础 R 中是直接的:
aggregate(list(avg = iris[[colOfInterest]]), iris["Species"], mean)
Run Code Online (Sandbox Code Playgroud)