问题:我想从具有条件的组发生后退填充值.我试图在所需的输出中生成列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)
这似乎有效:
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.