如何创建一个新变量,它是另一个二进制变量的条件累积和?
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))
换句话说,它是 x2
的 cumsum()
,"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
我正在清理一些眼球追踪数据,正如预期的那样,这些数据很乱。我停留在一个初步的步骤上,我会尽我最大的努力进行彻底的描述。解决方案可能非常简单。
我有两个变量,一个是二元变量 (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))
换句话说,它是 x2
的 cumsum()
,"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