繁体   English   中英

计数连续非零值的功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM