我正在清理一些眼动追踪数据,正如预期的那样,它是凌乱的。我已经坚持了一个我将尽力彻底描述的初步步骤。解决方案可能非常简单。
我有两个变量,一个是二进制(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之后。
答案 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