我试图按组创建7天的滞后差异。所以,我试图复制下面的代码,并希望得到类似的结果,而不是7天的延迟。
library(dplyr)
dat %>% mutate(dx=c(NA, diff(x)), dy=c(NA, diff(y)))
x y dx dy
1 5 3 NA NA
2 8 9 3 6
3 3 1 -5 -8
4 1 5 -2 4
但我收到错误消息:
错误:大小不兼容(900),期望905(组大小)或1
有一种快速简便的方法可以解决此错误。我承认它可能与mutate
有关答案 0 :(得分:3)
您需要使用NA
填充延迟天数。正如您需要1 NA
来填充第一行的差异值,延迟为1,现在需要7 NA
来填充第一行的差异值7行。内置mtcars
数据框的示例:
mtcars %>%
mutate(dx = c(NA, diff(mpg)),
dx7 = c(rep(NA,7), diff(mpg, 7)))
或分组:
mtcars %>%
group_by(am) %>%
mutate(dx = c(NA, diff(mpg)),
dx7 = c(rep(NA,7), diff(mpg, 7)))
zoo
包的版本diff
,它有内置的填充。您只需将向量转换为zoo
对象,即可调度diff.zoo
方法,而不是基础R diff
,使na.pad
可用:
library(zoo)
mtcars %>%
mutate(dx = diff(zoo(mpg), na.pad=TRUE),
dx7 = diff(zoo(mpg), 7, na.pad=TRUE))
答案 1 :(得分:1)
我建议完全删除diff
,并使用dplyr
自己的lag
。这需要处理所需的NA
。
mtcars %>%
mutate(dx = mpg - lag(mpg),
dx7 = mpg - lag(mpg, 7))