首页 > 解决方案 > 在循环中使用 dplyr 创建数据帧时出错

问题描述

我有一个包含所有数字变量和一个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)。我想使用循环为我的数据框中的所有变量调用此函数,但我知道该怎么做。

标签: rdplyr

解决方案


您可以使用rlang::symrlang::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带有运算符的函数内部不加引号!!。如果您想了解更多信息,可以查看quasiquotation 文档“使用 dplyr 编程”教程

请注意,rlang它已经包含在其中,dplyr因此您不必导入库。


推荐阅读