我有一个包含所有数字变量和一个date
变量的数据框。对于每个变量VARIABLE
,我想使用以下dplyr代码创建一个数据框:
avg_price = full_data_noNO %>%
group_by(Month, Country) %>%
dplyr::summarize(avg = mean(VARIABLE, na.rm = TRUE))
如果我对名称VARIABLE
进行硬编码,则此方法很好,但是如果我循环执行此操作,则会收到警告In mean.default(data.matrix(VARIABLE), na.rm = TRUE) : argument is not numeric or logical: returning NA
。结果,我的avg_price
数据框中的平均列仅包含NA。有人知道如何解决这个问题吗?
更新: 我目前有一个功能:
make_plots_expl_vars <- function (VARIABLE, full_data_noNO ) {
avg_price = full_data_noNO %>%
group_by(Month, Country) %>%
dplyr::summarize(avg = mean(VARIABLE, na.rm = TRUE))
return(avg_price)
例如,我使用make_plots_expl_vars("price", full_data_noNO)
进行呼叫。我想使用循环为数据框中的所有变量调用此函数,但是我知道该怎么做。
答案 0 :(得分:1)
您可以使用rlang::sym
或rlang::enquo
。
使用rlang::sym
:
make_plots_expl_vars <- function (VARIABLE, data=full_data_noNO) {
xx = sym(VARIABLE)
avg_price = data %>%
group_by(Month, Country) %>%
dplyr::summarize(avg = mean(!!xx, na.rm = TRUE))
return(avg_price)
}
make_plots_expl_vars("price", full_data_noNO)
make_plots_expl_vars("price") #you don't need it anymore with the "data" argument
使用rlang::enquo
:
make_plots_expl_vars <- function (VARIABLE, data=full_data_noNO) {
xx = enquo(VARIABLE)
avg_price = data %>%
group_by(Month, Country) %>%
dplyr::summarize(avg = mean(!!xx, na.rm = TRUE))
return(avg_price)
}
make_plots_expl_vars(price, full_data_noNO)
区别在于,在一种情况下,您用引号声明变量,而在另一种情况下不带引号。然后,使用dplyr
运算符在!!
函数中将变量取消引用。如果需要更多信息,可以查看the quasiquotation doc或"Programming with dplyr" tuto。
请注意,rlang
已包含dplyr
,因此您不必导入库。