R 函数来计算连续的非零值
使用如下所示的数据集:R 函数来计算连续的非零值,r,xts,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
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都会计算y/x!=0我尝试进行的另一个计算是事件中的平均x,其中事件定义为y中非零值的任何连续字符串。使用我上面提供的数据集,有两个事件:一个是长度1,另一个是长度3
对于长度为3的第二个事件,在我的For循环中,我想返回三个值,循环中每一步一个值:(0.3)、(0.3+0.4)/2和(0.3+0.4+0.4)/3
我很难确定最有效的方法是什么。我看过以前的一些帖子,它们主要是使用rle和类似(x!==0)的模式来寻找零值的索引
非常感谢您的帮助。根据OP文章中提供的计算,这可能会有所帮助。我们将'data.frame'转换为'data.table'(
setDT(df1)
),按不等于0的游程长度类型id'y'分组,将其中'y'不等于0的'x'的cumusm
除以'y'不等于0的序列'x',并将其指定为一个新列(:=
)
编辑:或改用cummean
setDT(df1)[,new1:= cummean(x[y!=0]), .(rleid(y!=0))]
谢谢你的建议。我忘了提到的一件影响代码建议的重要事情是y并不总是1,它可以是任何非零数。这会简单地将所有的“y==1”更改为“y!=0”吗?@user2943039在这种情况下,将其更改为
y=0
,它应该可以工作。@user2943039更新了帖子。早些时候,我忘了更改y=0
在rleid
中。在一个示例数据上进行了测试,它正在工作。由于某些原因,此代码不适用于我。一个问题是我的数据是一个xts,它似乎不是您可以通过data.table读取的东西。所以,我试着让它成为“as.data.frame”,但仍然没有产生任何结果。另外,我希望这是一个for循环,而这段代码中没有for循环的任何索引。我似乎找到了一个解决方法,请忽略前面的注释。再次感谢你的帮助!
setDT(df1)[,new1:= cummean(x[y!=0]), .(rleid(y!=0))]