【问题标题】:Find next N rows when condition is TRUE当条件为 TRUE 时查找下 N 行
【发布时间】:2016-08-14 11:15:13
【问题描述】:

当条件为 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。获得这个的最佳方法是什么?

【问题讨论】:

  • dt[, shift(condition, 0:N), by = a] 几乎可以工作,但很难对 shift 的输出进行行求和

标签: r data.table


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我们可以试试

     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
    

    【讨论】:

    • 抱歉,我选择的示例可能具有误导性。我不想要 TRUE 直到最后,但接下来的 N 行。我已经修改了示例。
    • 谢谢!但是如果一组中有两行满足条件,即which(condition)返回一个向量,则失败
    • @jf328 此解决方案基于您提供的示例。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2013-06-13
    • 2016-08-23
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多