第一次出现0后,将行列的后续值更改为0
我有以下内容data.table:-
a <- data.table(name = letters[1:5], Y1 = c(1, 1, 0, 1, 0), Y2 = c(1,1,1,1,0),
Y3 = c(1,1,1,0,1), Y4 = c(1,1,1,1,1), Y5 = c(0,0,0,0,1))
# name Y1 Y2 Y3 Y4 Y5
#1: a 1 1 1 1 0
#2: b 1 1 1 1 0
#3: c 0 1 1 1 0
#4: d 1 1 0 1 0
#5: e 0 0 1 1 1
我想对此进行操作data.table,以便如果在行中检测到 0 的列Y1to Y5,则所有后续列值都应更改为 0。例如,对于 中的4第data.table0行,第一个 0 在 中Y3。因此,Y4并且Y5应该更改为 0。在5第 th 行中,第一个 0 出现在Y1列中,因此,Y2直到Y5该行的列应该更改为 0。
结果data.table应如下:-
b <- a <- data.table(name = letters[1:5], Y1 = c(1, 1, 0, 1, 0), Y2 = c(1,1,0,1,0),
Y3 = c(1,1,0,0,0), Y4 = c(1,1,0,0,0), Y5 = c(0,0,0,0,0))
# name Y1 Y2 Y3 Y4 Y5
#1: a 1 1 1 1 0
#2: b 1 1 1 1 0
#3: c 0 0 0 0 0
#4: d 1 1 0 0 0
#5: e 0 0 0 0 0
回答
这是一个选项:
cols <- paste0("Y", 1L:5L)
a[, (cols) := lapply(Reduce(`&`, .SD, accumulate=TRUE), as.integer), .SDcols=cols]