使用如下所示的数据集:
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)。
非常感谢任何帮助。
答案 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))]