![](/img/trans.png)
[英]How do I calculate percent difference between max and min values in consecutive rows by group?
[英]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.