按组计算连续行中的值之间的差异

这是我的df (data.frame):

  group value [1] 1 10 [2] 1 20 [3] 1 25 [4] 2 5 [5] 2 10 [6] 2 15 ... 

我需要计算按组连续排列的值之间的差异。

所以,我需要一个结果。

  group value diff [1] 1 10 NA (because there is a no previous value) [2] 1 20 10 (value[2]-value[1]) [3] 1 25 5 (value[3]-value[2]) [4] 2 5 NA (because group is changed) [5] 2 10 5 (value[5]-value[4]) [6] 2 15 5 (value[6]-value[5]) ... 

虽然,我可以通过使用ddply来处理这个问题,但这需要太多的时间。 这是因为我有很多团队在我的df 。 (在我的df超过100万组)

还有其他有效的方法来处理这个问题吗?

data.table可以很快做到这一点。

 require(data.table) df <- data.table(group = rep(c(1, 2), each = 3), value = c(10,20,25,5,10,15)) #setDT(df) #if df is already a data frame setkey(df, group) df[ , diff := c(NA, diff(value)), by = group] # group value diff #1: 1 10 NA #2: 1 20 10 #3: 1 25 5 #4: 2 5 NA #5: 2 10 5 #6: 2 15 5 setDF(df) #if you want to convert back to old data.frame syntax 

或者使用dplyr

 library(dplyr) df %>% group_by(group) %>% mutate(Diff = c(NA, diff(value))) 

你可以使用基函数ave()来实现这个function

 df <- data.frame(group=rep(c(1,2),each=3),value=c(10,20,25,5,10,15)) df$diff <- ave(df$value, factor(df$group), FUN=function(x) c(NA,diff(x))) 

哪个返回

  group value diff 1 1 10 NA 2 1 20 10 3 1 25 5 4 2 5 NA 5 2 10 5 6 2 15 5 

尝试这与tapply

 df$diff<-as.vector(unlist(tapply(df$value,df$group,FUN=function(x){ return (c(NA,diff(x)))})))