我正在尝试使用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中的错误(替换(expr),envir,enclos): '1:100'不是函数,字符或符号
根本原因是rollapply()中的中位数正在解析为data.frame中的变量,而不是函数“median”。我已经能够使用以下代码解决这个问题:
df %>% mutate(ln_median = log(median)) %>%
mutate(ln_median_10 = rollapply(ln_median, 5, function(a) median(a), fill = NA))
也就是说,通过包装中值函数来抑制它被解释为data.frame中的变量。
是否有更优雅的方式来实现同样的目标?
答案 0 :(得分:1)
您是否尝试过将函数名称作为
传递stats::median
答案 1 :(得分:0)
正如评论中提到的@lebelinoz,您可以使用fill = NA
来解决不等长度错误。但是无法重现您的错误。另请注意,mutate
允许您使用刚刚在同一函数中创建的变量。所以不需要第二个mutate
:
library(zoo)
df %>%
mutate(ln_median = log(median),
ln_median_10 = rollapply(ln_median, 5, median, fill = NA))
答案 2 :(得分:0)
如果确实存在问题(但我也无法重现),您可以使用match.fun("median")
代替median