R:dplyr 管道条件 lead/lag 使用 ifelse 出现意外行为
R: dplyr pipe conditional lead/lag using ifelse with unexpected behavior
我正在尝试使用 ifelse 在 dplyr 管道中使用条件 lead
/lag
函数,但出现错误。但是,在管道外使用相同的方法似乎可行。我错过了什么?
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.
这个:
test %>%
mutate(delta = ifelse(a=="s",b+lag(b,n=12),
ifelse(a=="m",b+lag(b,n=6),0)))
有效。这意味着您不能在 lag
个参数中传递表达式。
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))
我正在尝试使用 ifelse 在 dplyr 管道中使用条件 lead
/lag
函数,但出现错误。但是,在管道外使用相同的方法似乎可行。我错过了什么?
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.
这个:
test %>%
mutate(delta = ifelse(a=="s",b+lag(b,n=12),
ifelse(a=="m",b+lag(b,n=6),0)))
有效。这意味着您不能在 lag
个参数中传递表达式。
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))