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

How to create a new variable that is a conditional cumulative sum of another binary variable?

我正在清理一些眼球追踪数据,正如预期的那样,这些数据很乱。我停留在一个初步的步骤上,我会尽我最大的努力进行彻底的描述。解决方案可能非常简单。

我有两个变量,一个是二元变量 (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))

我需要创建一个新变量(x3),它是 x2 连续情况下 x1 等于 1 的累加和。结束产品看起来像这样:

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), 
                  x3 = c(0, 23, 67, 0, 36, 73, 101, 0, 30, 71))

换句话说,它是 x2cumsum(),"resets" 在 x1 中的每个 0 之后。

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

在 data.table 中,您可以按 x1 的运行分组(使用 by=rleid(x1))然后 return 0 如果 x1 的组为 0,否则 return x2 的累加和。 := 用于按引用分配变量。

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

这个returns

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