【问题标题】:How to create a new variable that is a conditional cumulative sum of another binary variable?如何创建一个新变量,它是另一个二进制变量的条件累积和?
【发布时间】:2017-06-27 17:49:00
【问题描述】:

我正在清理一些眼动追踪数据,正如预期的那样,这些数据很混乱。我被困在一个初步的步骤上,我会尽力彻底描述。解决方案可能很简单。

我有两个变量,一个是二进制变量 (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),它对于 x1 等于 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))

换句话说,x2 中的 cumsum()x1 中的每个 0 之后“重置”。

【问题讨论】:

  • 为什么第二个x3值等于44?
  • 糟糕——忽略了一个错误。我刚刚修好了。感谢您的关注。

标签: r conditional cumsum


【解决方案1】:
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

【讨论】:

  • 或变体:transform(dat, x3 = ave(x2 * x1, cumsum(x1 == 0), FUN = cumsum))
  • 太棒了!非常感谢。将添加到我的曲目中。
【解决方案2】:

在 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

【讨论】:

  • 感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多