Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 函数来计算连续的非零值_R_Xts - Fatal编程技术网

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))]