使用ifelse的dplyr管道条件lead/lag出现意外行为

5

我正在尝试在dplyr管道中使用条件的lead/lag函数,使用ifelse却出现了错误。然而,在管道之外使用相同的方法似乎可以工作。我错过了什么?

require(dplyr)

数据:

test <- data.frame(a = c("b","b","b","b","b","b",
                         "m","m","m","m","m","m",
                         "s","s","s","s","s","s"), 
                   b = replicate(1,n=18), 
                   stringsAsFactors=F)

dplyr管道:

test %>%
  mutate(delta = ifelse(a == "s", b + lag(b, n = 2*6),
                        ifelse(a == "m", b + lag(b, n = 1*6), 0)))

# Error: could not convert second argument to an integer. type=LANGSXP, length = 3

没有管道时它可以正常工作:
test$delta <- ifelse(test$a == "s", test$b + lag(test$b, n = 2*6),
                     ifelse(test$a == "m", test$b + lag(test$b, n = 1*6), 0))

我发现一些迹象表明,在使用分组数据框时,dplyr的lead/lag存在问题。但是我这里没有进行分组。

版本信息:R 3.1.1和dplyr_0.4.1。

2个回答

4
这是:

test %>%
    mutate(delta = ifelse(a=="s",b+lag(b,n=12),
                          ifelse(a=="m",b+lag(b,n=6),0)))

这意味着您不能在lag参数中传递表达式。


2
如果是这样,为什么 ifelse(test$a=="s",test$b+lag(test$b,n=2*6), ifelse(test$a=="m",test$b+lag(test$b,n=1*6), 0)) 能够生效? - David Arenburg
2
这听起来像是 dplyr 的一个 bug。 - Randy Lai
这与表达式的评估有关。在此代码中,所有表达式都在全局环境中进行评估,在dplyr情况下,评估发生在不同的环境中。这可能是dplyr中的一个错误。 - mpiktas
相关问题(即使没有 group_by(cyl),也会生成错误)。 - Henrik

1

dplyr无法解析表达式。一种解决方案是先定义函数:

foo <- function(a, b)
    ifelse(a=="s",b+lag(b,n=2*6), ifelse(a=="m",b+lag(b,n=1*6),0))
test %>% mutate(delta = foo(a,b))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接