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

时间:2017-06-27 17:49:00

标签: 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))

我需要创建一个新变量(x3),它是x2等于1的连续情况下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 = c(0, 23, 67, 0, 36, 73, 101, 0, 30, 71))

换句话说,它是cumsum() x2&#34;重置&#34;在x1中的每个0之后。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

在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