从具有条件的组中的出现向后填充值

BEM*_*EMR 6 r dataframe dplyr

问题:我想从具有条件的组发生后退填充值.我试图在所需的输出中生成列C.

如果A <= 35,则将C设置为B并向后填充1,如果A> 35,则停止填充.

我正在尝试使用dplyr完成此任务.

建立在类似于我之前的问题的基础上:按组的出现向后填充值

输入:

DAT_in  = data.frame(ID=c(1,1,1,1,
                       2,2,2,
                       3,3,3,
                       4,4,4,4,4), 
                  time=c(1,2,3,4,
                         1,2,3,
                         1,2,3,
                         1,2,3,4,5),
                  A=c(100,35,25,0,
                      100,75,55,
                      100,28,25,
                      100,30,45,25,0),
                  B=c(0,0,0,1,
                      0,0,0,
                      0,0,1,
                      0,0,0,0,1))
Run Code Online (Sandbox Code Playgroud)

期望的输出(C):

DAT_out  = data.frame(ID=c(1,1,1,1,
                   2,2,2,
                   3,3,3,
                   4,4,4,4,4), 
              time=c(1,2,3,4,
                     1,2,3,
                     1,2,3,
                     1,2,3,4,5),
              A=c(100,35,25,0,
                  100,75,55,
                  100,28,25,
                  100,30,45,25,0),
              B=c(0,0,0,1,
                  0,0,0,
                  0,0,1,
                  0,0,0,0,1),
              C=c(0,1,1,1,
                  0,0,0,
                  0,1,1,
                  0,0,0,1,1))
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 9

这似乎有效:

library(data.table)
setDT(DAT_in)

DAT_in[order(ID, -time), C := as.integer(cumsum(A > 35) == 0L), by=ID][]

all.equal(DAT_in$C, DAT_out$C) # TRUE
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • 从最后一期倒退.
  • 标记为1直到A > 35.

DT[i, v := ..., by=g]只有i在分配到列期间的订单v; DT保留初始排序顺序.

as.integer强制TRUE为1; 假为0.