R中dplyr的非标准评估(NSE)
non-standard evaluation (NSE) with dplyr in R
我正在尝试编写一个函数来创建摘要 table。我有兴趣总结的变量可能会改变,因此,我想把它放在一个函数中。我遵循了 dpylr vignette 中关于 NSE 的示例,但由于某种原因它对我不起作用。这是函数:
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
我该如何解决这个问题?
你应该使用 curly-curly ({{}}
) 来避免 quo
& !!
。您也可以使用 count
,这是 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))," %"))
}
我正在尝试编写一个函数来创建摘要 table。我有兴趣总结的变量可能会改变,因此,我想把它放在一个函数中。我遵循了 dpylr vignette 中关于 NSE 的示例,但由于某种原因它对我不起作用。这是函数:
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
我该如何解决这个问题?
你应该使用 curly-curly ({{}}
) 来避免 quo
& !!
。您也可以使用 count
,这是 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))," %"))
}