Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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_Conditional_Cumsum - Fatal编程技术网

R 如何创建另一个二进制变量的条件累积和的新变量?

R 如何创建另一个二进制变量的条件累积和的新变量?,r,conditional,cumsum,R,Conditional,Cumsum,我正在清理一些眼球跟踪数据,正如所料,这些数据很混乱。我被困在一个初步的步骤上,我将尽我所能详细描述。解决方案可能相当简单 我有两个变量,一个是二进制的(x1),另一个是连续的(x2),例如: dat <- data.frame(x1 = c(0,1,1,0,1,1,1,0,1,1), x2 = c(22,23,44,25,36,37,28,19,30,41)) 换句话说,在数据表中,每0次“重置”是x2的cumsum()的cumsum()在data

我正在清理一些眼球跟踪数据,正如所料,这些数据很混乱。我被困在一个初步的步骤上,我将尽我所能详细描述。解决方案可能相当简单

我有两个变量,一个是二进制的(
x1
),另一个是连续的(
x2
),例如:

dat <- data.frame(x1 = c(0,1,1,0,1,1,1,0,1,1), 
                  x2 = c(22,23,44,25,36,37,28,19,30,41))

换句话说,在数据表中,每0次“重置”是
x2
cumsum()
cumsum()
在data.table中,可以按x1的运行分组(使用
by=rleid(x1)
),如果x1组为0,则返回0,否则返回x2的累计和<代码>:=用于通过引用分配变量

dat$x3 <- with(dat, ave(replace(x2, x1 == 0, 0), cumsum(x1 == 0), FUN=cumsum))

dat
#   x1 x2  x3
#1   0 22   0
#2   1 23  23
#3   1 44  67
#4   0 25   0
#5   1 36  36
#6   1 37  73
#7   1 28 101
#8   0 19   0
#9   1 30  30
#10  1 41  71
library(data.table)
setDT(dat)[, x3 := if(x1[1] == 0) 0 else cumsum(x2), by=rleid(x1)]
这是回报

dat
    x1 x2  x3
 1:  0 22   0
 2:  1 23  23
 3:  1 44  67
 4:  0 25   0
 5:  1 36  36
 6:  1 37  73
 7:  1 28 101
 8:  0 19   0
 9:  1 30  30
10:  1 41  71

在data.table中,您可以按x1的运行进行分组(使用
by=rleid(x1)
),然后如果x1的组为0,则返回0,否则返回x2的累积和<代码>:=用于通过引用分配变量

library(data.table)
setDT(dat)[, x3 := if(x1[1] == 0) 0 else cumsum(x2), by=rleid(x1)]
这是回报

dat
    x1 x2  x3
 1:  0 22   0
 2:  1 23  23
 3:  1 44  67
 4:  0 25   0
 5:  1 36  36
 6:  1 37  73
 7:  1 28 101
 8:  0 19   0
 9:  1 30  30
10:  1 41  71

为什么第二个x3值等于44?哎呀——忽略了一个错误。我刚修好。谢谢注意。为什么第二个x3值等于44?哎呀,忽略了一个错误。我刚修好。感谢您的注意。或变化:
transform(dat,x3=ave(x2*x1,cumsum(x1==0),FUN=cumsum))
太棒了!非常感谢。将添加到我的曲目或变体中:
transform(dat,x3=ave(x2*x1,cumsum(x1==0),FUN=cumsum))
太棒了!非常感谢。将添加到我的曲目中。谢谢回复!谢谢你的回复!