簡體   English   中英

按組計算連續行中值之間的差異

[英]Calculate difference between values in consecutive rows by group

這是我的df (data.frame):

group value
1     10
1     20
1     25
2     5
2     10
2     15 

我需要按組計算連續行中值之間的差異。

所以,我需要一個結果。

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中有很多組。 (我的df中有超過 1,000,000 個組)

有沒有其他有效的方法來處理這個問題?

使用shift函數,包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

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

或者使用dplyr中的lag函數

df %>%
    group_by(group) %>%
    mutate(Diff = value - lag(value))
#   group value  Diff
#   <int> <int> <int>
# 1     1    10    NA
# 2     1    20    10
# 3     1    25     5
# 4     2     5    NA
# 5     2    10     5
# 6     2    15     5

對於替代 pre- data.table::shift和 pre- dplyr::lag ,請參閱編輯。

您可以為此使用基本函數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)))

返回

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

dplyr 1.1.0起,您可以使用.by內聯臨時分組縮短dplyr版本:

mutate(df, diff = value - lag(value), .by = group)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM