【问题标题】:Variable name collision in dplyrdplyr 中的变量名冲突
【发布时间】:2018-02-20 05:32:25
【问题描述】:

我正在尝试使用 dplyr 计算包含在 data.frame 中的变量的移动中位数。我遇到的问题是我传递给 rollapply() 的函数与原始 data.frame 中的变量具有相同的名称。例如:

df <- data.frame(median = seq(1:100))

df %>%
  mutate(ln_median = log(median)) %>%
  mutate(ln_median_10 = rollapply(ln_median, 5, median))

生成错误消息:

eval(substitute(expr), envir, enclos) 中的错误: '1:100' 不是函数、字符或符号

根本原因是 rollapply() 中的中位数解析为 data.frame 中的变量,而不是函数“中位数”。我已经能够使用以下代码解决这个问题:

df %>% mutate(ln_median = log(median)) %>%
       mutate(ln_median_10 = rollapply(ln_median, 5, function(a) median(a), fill = NA))

也就是说,通过包装中值函数以抑制它被解释为 data.frame 中的变量。

有没有更优雅的方式来实现同样的目标?

【问题讨论】:

  • 我复制了您的代码并得到了另一个错误:“列 ln_median_10 的长度必须为 100(行数)或 1,而不是 96”。我通过将fill = NA 参数添加到rollapply 来修复
  • rollapply 来自哪个包?是zoo吗?

标签: r dplyr tidyverse


【解决方案1】:

您是否尝试过将函数名称传递为 as

stats::median

【讨论】:

    【解决方案2】:

    如果确实是问题所在(但我也无法重现),您可以使用 match.fun("median") 而不是 median

    【讨论】:

      【解决方案3】:

      正如@lebelinoz 在cmets 中提到的,您可以使用fill = NA 来解决不等长错误。虽然无法重现您的错误。另请注意,mutate 允许您使用刚刚在同一函数中创建的变量。所以不需要第二个mutate

      library(zoo)
      
      df %>%
        mutate(ln_median = log(median),
               ln_median_10 = rollapply(ln_median, 5, median, fill = NA))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多