【问题标题】:Error when creating dataframe using dplyr in loop在循环中使用 dplyr 创建数据帧时出错
【发布时间】:2018-11-05 18:46:57
【问题描述】:

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

【问题讨论】:

  • 能否请您显示因此错误而失败的循环代码?帮助您会更容易。
  • 如果您要遍历 data.frame 中的所有列(月份/国家除外),您可能会从使用 summarise_if(is.numeric, mean) 或 summarise_all(mean) 中获益

标签: r dplyr


【解决方案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 中,因此您不必导入库。

【讨论】:

  • 非常感谢!!我一直在寻找这个解决方案的日子,现在它终于奏效了!
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多