用于计算连续非零值的函数

时间:2015-10-01 16:30:37

标签: r xts

使用如下所示的数据集:

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和模式找到零值的索引(x!== 0)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

根据OP的帖子中提供的计算,可能会有所帮助。我们将'data.frame'转换为'data.table'(setDT(df1)),按照'y'的游程长度类型id分组,不等于0,我们将cumusm除以'x',其中'y'不是等于0,'x'的序列不是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))]