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))
太棒了!非常感谢。将添加到我的曲目中。谢谢回复!谢谢你的回复!