当条件为TRUE时,查找下一行N行

时间:2016-04-21 10:11:20

标签: r data.table

当条件为TRUE且后面有N行时,如何获取行?如果N行中任何一行的条件为TRUE,请重新开始计数。也为每个小组执行此操作。

dt = data.table(a = rep(c("a","b","c"), each = 5), b = 1:15)
dt[, condition := b%%4 == 0]
> dt
    a  b condition **desiredOutcome**
 1: a  1     FALSE           FALSE
 2: a  2     FALSE           FALSE
 3: a  3     FALSE           FALSE
 4: a  4      TRUE            TRUE
 5: a  5     FALSE            TRUE
 6: b  6     FALSE           FALSE
 7: b  7     FALSE           FALSE
 8: b  8      TRUE            TRUE
 9: b  9     FALSE            TRUE
10: b 10     FALSE            TRUE
11: c 11     FALSE           FALSE
12: c 12      TRUE            TRUE
13: c 13     FALSE            TRUE
14: c 14     FALSE            TRUE
15: c 15     FALSE           FALSE

desiredOutcome基于N=2并按列a分组。最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

找到了总结shift结果的方法,即矢量列表。

dt[, desiredOutcome := Reduce('+', shift(con, 0:2, fill = 0)), by = a]

答案 1 :(得分:1)

我们可以尝试

 dt[dt[, {i1 <- which(condition); .I[i1:pmin((i1+2), .N)]} , a]$V1,
     desiredOutcome:= TRUE][is.na(desiredOutcome), desiredOutcome := FALSE][]
# a  b condition desiredOutcome
# 1: a  1     FALSE          FALSE
# 2: a  2     FALSE          FALSE
# 3: a  3     FALSE          FALSE
# 4: a  4      TRUE           TRUE
# 5: a  5     FALSE           TRUE
# 6: b  6     FALSE          FALSE
# 7: b  7     FALSE          FALSE
# 8: b  8      TRUE           TRUE
# 9: b  9     FALSE           TRUE
#10: b 10     FALSE           TRUE
#11: c 11     FALSE          FALSE
#12: c 12      TRUE           TRUE
#13: c 13     FALSE           TRUE
#14: c 14     FALSE           TRUE
#15: c 15     FALSE          FALSE