首页 > 解决方案 > 在 R 中使用 dplyr 进行非标准评估 (NSE)

问题描述

我正在尝试编写一个函数来创建汇总表。我有兴趣总结的变量可能会改变,因此,我想将它放在一个函数中。我按照关于 NSE 的dpylr 小插图中的示例进行操作,但由于某种原因它对我不起作用。这是功能:

print(agegroup) # this is a string
table_summary <- function (data, group_by1){

  quo_group_by1 = quo(group_by1)
  print(quo_group_by1)

  data %>%
  dplyr::group_by(!! quo_group_by1) %>%
  dplyr::summarise(N = n()) %>%
  dplyr::mutate(pct = paste0((round(N/sum(N)*100, 2))," %"))

}

table_summary(clientData, agegroup)

我收到以下错误:

[1] "ag5"
<quosure>
expr: ^group_by1
env:  0x7faaec29e030
Error: Column `group_by1` is unknown

我怎样才能解决这个问题?

标签: rdplyrnse

解决方案


{{}}您应该使用避免quo&的 curly-curly ( ) !!。您也可以使用countwhich 是group_by+的快捷方式summarise

table_summary <- function (data, group_by1){

   data %>%
    dplyr::count({{group_by1}}) %>%
    dplyr::mutate(pct = paste0((round(N/sum(N)*100, 2))," %"))
}

table_summary(clientData, agegroup)

它似乎agegroup是一个字符串。要继续使用 OP 的方法,我们需要将其转换为符号 ( sym) 并评估它 ( !!)

table_summary <- function (data, group_by1){

  data %>%
    dplyr::group_by(!!sym(group_by1)) %>%
    dplyr::summarise(N = n()) %>%
    dplyr::mutate(pct = paste0((round(N/sum(N)*100, 2))," %"))

}

推荐阅读