Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按组计算连续行中的值之间的差异_R - Fatal编程技术网

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

R 按组计算连续行中的值之间的差异,r,R,这是我的df(data.frame): 我需要按组计算连续行中的值之间的差异 所以,我需要一个结果 group value diff 1 10 NA # because there is a no previous value 1 20 10 # value[2] - value[1] 1 25 5 # value[3] value[2] 2 5 NA # because group is changed 2 10 5

这是我的
df
(data.frame):

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

所以,我需要一个结果

group value diff
1     10    NA # because there is a no previous value
1     20    10 # value[2] - value[1]
1     25    5  # value[3] value[2]
2     5     NA # because group is changed
2     10    5  # value[5] - value[4]
2     15    5  # value[6] - value[5]
虽然我可以通过使用
ddply
来处理这个问题,但是它花费了太多的时间。这是因为我的
df
中有很多组。(my
df中超过1000000组)


是否有其他有效的方法来处理此问题?

数据。使用
shift
功能,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

df[ , diff := value - shift(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

有关数据.table::shift
和dplyr::lag之前的备选方案,请参见编辑。

请尝试使用tapply

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

df$diff您可以为此使用基本函数
ave()

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)))

这就是我必须做的:
df$diff您知道ddply解决方案吗?在我推断可能需要一个不同的函数之前,我已经为此工作了一段时间。我假设它类似于
ddply(df,.(group),transform,diff=c(NA,diff(value))
您如何修改它来计算百分比变化?您可以在这里应用任何函数。例如,如果这是我们的函数:
perc\u change如何将NA替换为下一个值,那么第1行的
Diff
也将是第2行的
10
?相关问题:我发现两个线程都很有帮助。对于日期,可以使用以下命令:
df$diff
df$diff<-as.vector(unlist(tapply(df$value,df$group,FUN=function(x){ return (c(NA,diff(x)))})))
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