用dplyr mutate进行组间差异

时间:2016-07-13 19:37:31

标签: r dplyr

我试图按组创建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

有关

2 个答案:

答案 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)))
@ Axeman的好回答提醒我,你也可以使用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))