使用dplyr动态访问列

时间:2018-12-17 13:23:36

标签: r dplyr

我正在尝试使用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有关。

2 个答案:

答案 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更适用于引用未引用的列(例如,编写函数时),您可以使用symsyms访问带引号的列。

请注意,symdplyr附带的,但是如果没有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)))