dplyr中的变量名冲突

时间:2017-09-11 21:43:03

标签: r dplyr tidyverse

我正在尝试使用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中的变量。

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

3 个答案:

答案 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