[英]Calculate conditional cumulative sum
我有以下数据框:
N=seq(1:18)
Pre=c(0.5, 0.4, 0.7, 0.9, 0.6, 0.3, 0.7, 0.8, 0.6, 0.5, 0.4, 0.7, 0.9, 0.6, 0.3, 0.7, 0.8, 0.6)
df1=data.frame(N, Pre)
E=c(3.1, 2.9, 4.4)
Category=c(22,35,36)
df2=data.frame(E, Category)
我想在df1中创建两个新列( cumsum
和category
)
cumsum
列中的值将累积,直到该值等于或小于df2$E
的值为止;当该值大于df2$E
时, cumsum
将再次开始。 在category
列中,值将为22,35或36,依此类推。
结果将是
这是一个简短的示例,我需要使用非常大的数据框来执行此操作。
为了得到Category
栏,我们可以cut
cumsum
的价值Pre
并定义breaks
为cumsum
的E
从df2
和labels
作为各自的Category
值。 现在,我们可以将此Category
值用作分组变量,并使用ave
在每个组中cumsum
Pre
值的cumsum
。
df1$Category <- cut(cumsum(df1$Pre), breaks = c(0, cumsum(df2$E)),
labels = df2$Category)
df1$Cumsum <- ave(df1$Pre, df1$Category, FUN = cumsum)
df1
# N Pre Category Cumsum
#1 1 0.5 22 0.5
#2 2 0.4 22 0.9
#3 3 0.7 22 1.6
#4 4 0.9 22 2.5
#5 5 0.6 22 3.1
#6 6 0.3 35 0.3
#7 7 0.7 35 1.0
#8 8 0.8 35 1.8
#9 9 0.6 35 2.4
#10 10 0.5 35 2.9
#11 11 0.4 36 0.4
#12 12 0.7 36 1.1
#13 13 0.9 36 2.0
#14 14 0.6 36 2.6
#15 15 0.3 36 2.9
#16 16 0.7 36 3.6
#17 17 0.8 36 4.4
#18 18 0.6 <NA> 0.6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.