【发布时间】: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吗?