我正在尝试使用dplyr
动态地取一列的平均值。通过该网站https://dplyr.tidyverse.org/articles/programming.html,我了解到应该做到以下几点:
library(dplyr)
df <- data.frame(column=c(1,2,3))
column_string <- "column"
variable <- enquo(column_string)
print(variable)
输出:
<quosure>
expr: ^"column"
env: empty
然后:
df %>% summarise(mean=mean(!! variable))
输出:
mean
1 NA
Warning message:
In mean.default(~"column") :
argument is not numeric or logical: returning NA
预期结果是一个当然值为2的数据框。我想念什么?我怀疑与保证环境为empty
有关。
答案 0 :(得分:3)
这将起作用:
library(dplyr)
df <- data.frame(column=c(1,2,3))
column_string <- "column"
variable <- sym(column_string)
print(variable)
df %>% summarise(mean=mean(!! variable))
Enquo
更适用于引用未引用的列(例如,编写函数时),您可以使用sym
或syms
访问带引号的列。
请注意,sym
是dplyr
附带的,但是如果没有as.symbol
,您也可以这样做。
何时可以使用enquo
的示例:
summarise_mean <- function(df, col) {
variable <- enquo(col)
df %>% summarise(mean = mean(!! variable))
}
输出:
summarise_mean(df, column)
mean
1 2
答案 1 :(得分:0)
为什么不只使用简单用法as.symbol
df %>% summarise(mean=mean(!! as.symbol(column_string)))