在循环中使用dplyr创建数据框时出错

时间:2018-11-05 09:07:22

标签: r 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)进行呼叫。我想使用循环为数据框中的所有变量调用此函数,但是我知道该怎么做。

1 个答案:

答案 0 :(得分:1)

您可以使用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运算符在!!函数中将变量取消引用。如果需要更多信息,可以查看the quasiquotation doc"Programming with dplyr" tuto

请注意,rlang已包含dplyr,因此您不必导入库。