2016-07-13 61 views
-1

我试图按组创建7天的滞后差异。所以,我试图复制下面的代码,并希望得到类似的结果,而不是7天的延迟。与dplyr突变组的差异

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 

但我收到错误消息:

Error: incompatible size (900), expecting 905 (the group size) or 1

是有一个快速简便的方法来解决这个错误。我承担它可能必须做与变异

+0

请显示您的输入示例。基于输出,没有'colname1,colname2' – akrun

+0

请阅读[如何问一个好问题](http://stackoverflow.com/help/how-to-ask)以及如何给[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610)。这会让其他人更容易帮助你。 – Jaap

+0

感谢您的评论。我的代码和上面的代码之间唯一的区别是group_by。 so dat%>%group_by(anything)%>%mutate(dx = c(NA,diff(x)),dy = c(NA,diff(y)))。我知道这是一个简单的解决方案,我只是不知道如何解决它,因为我对r相当陌生。 –

回答

3

你需要垫与NA为你的滞后天数。正如你需要1 NA来填补第一行差值为1的差值,现在你需要填充7个缺失差值的前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))) 

@斧头兵的漂亮话启发了我,你还可以使用diffzoo包的版本,它有内置的填充。你只需要你的载体转换为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)) 
+0

哦,天哪!非常感谢。有效! –

1

我建议摆脱diff完全的,并且使用dplyr非常拥有lag。这需要照顾所需的NA's。

mtcars %>% 
    mutate(dx = mpg - lag(mpg), 
     dx7 = mpg - lag(mpg, 7)) 
+1

那么,你赢得代码高尔夫! – eipi10

+1

嗯,我从去年左右的答案中学到了很多东西。 – Axeman

+1

谢谢!很高兴知道。 – eipi10