[英]Function to count consecutive non-zero values
使用如下数据集:
Index x y
2012-07-24 07:00:00 0.1 0
2012-07-24 07:15:00 0.2 1
2012-07-24 07:30:00 0.3 0
2012-07-24 07:45:00 0.2 0
2012-07-24 08:00:00 0.3 1
2012-07-24 08:15:00 0.4 1
2012-07-24 08:30:00 0.4 1
2012-07-24 08:45:00 0.5 0
2012-07-24 09:00:00 0.6 0
我目前有一个遍历此大型数据集的for循环,实际上每次y!= 0时都会计算y / x。我尝试进行的另一次计算是事件内的平均值x,其中事件定义为任何连续的字符串在y中为非零值。 使用上面提供的数据集,有两个事件:长度为1的事件,长度为3的事件之一。
对于长度3的第二个事件,在我的for循环中,我想返回三个值,对于循环的每一步一个值:(0.3),(0.3 + 0.4)/ 2和(0.3 + 0.4 + 0.4)/ 3。
我无法确定最有效的方法。 我看过一些以前的文章,这些文章主要是使用rle和诸如which(x!== 0)之类的模式来寻找零值索引。
任何帮助是极大的赞赏。
根据OP帖子中提供的计算,可能会有所帮助。 我们将'data.frame'转换为'data.table'( setDT(df1)
),并按运行长度类型id'y'分组,该ID不等于0,我们将'x'的cumusm
除以' y的序列不等于0,因为y的序列不等于0,并将( :=
)分配为新列('new1')。
library(data.table)#v1.9.6+
setDT(df1)[,new1:=cumsum(x[y!=0])/seq_along(x)[y!=0] ,.(rleid(y!=0))]
df1
# Index x y new1
#1: 2012-07-24 07:00:00 0.1 0 NA
#2: 2012-07-24 07:15:00 0.2 1 0.2000000
#3: 2012-07-24 07:30:00 0.3 0 NA
#4: 2012-07-24 07:45:00 0.2 0 NA
#5: 2012-07-24 08:00:00 0.3 1 0.3000000
#6: 2012-07-24 08:15:00 0.4 1 0.3500000
#7: 2012-07-24 08:30:00 0.4 1 0.3666667
#8: 2012-07-24 08:45:00 0.5 0 NA
#9: 2012-07-24 09:00:00 0.6 0 NA
编辑:或改用cummean
setDT(df1)[,new1:= cummean(x[y!=0]), .(rleid(y!=0))]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.