【问题标题】:How to search for and perform calculations with groups with data.table如何使用 data.table 搜索组并执行计算
【发布时间】:2019-06-01 04:09:59
【问题描述】:

我有一个 B_S 列,其中包含两个值“S2”和“S1”。 S2 标记每个组的边界和每个组的原始行。 S1 用 High 列标记了可能需要检查的项目。

例如,我需要检查 S1 High 是否大于 S2 High。我需要遍历所有 S1 条目并选择 S1 High 高于 S2 High 的行并删除 S1 High 不高于 S2 的行。

我对 data.table 没有足够的经验来产生这样的结果。

以下是数据示例:

structure(list(Time = c("16/10/2014 09:19", "16/10/2014 09:20", 
"16/10/2014 09:21", "16/10/2014 09:22", "17/12/2014 12:59", "17/12/2014   13:00", 
    "17/12/2014 13:01", "17/12/2014 13:02"), High = c(1833.5, 1832.5, 
1820.5, 1852.5, 1992, 1991.25, 2001.25, 2002.25), rn = c(77470L, 
77469L, 77468L, 77467L, 17758L, 17757L, 17756L, 17755L), B_S = c("S2", 
"S1", "S1", "S1", "S2", "S1", "S1", "S1")), row.names = c(NA, 
-8L), class = c("data.table", "data.frame")

预期结果: 对于第 1 组(第 1-4 行),将保留第 1 行和第 4 行。

 structure(list(Time = c("16/10/2014 09:19", "16/10/2014 09:22"
), High = c(1833.5, 1852.5), rn = c(77470L, 77467L), B_S = c("S2", 
"S1")), class = c("data.table", "data.frame"), row.names = c(NA, 
-2L)

对于第二组(第 5-8 行),第 5 行和第 7 行将被保留。

    structure(list(Time = c("17/12/2014 12:59", "17/12/2014 13:01"
), High = c(1992, 2001.25), rn = c(17758L, 17756L), B_S = c("S2", 
"S1")), class = c("data.table", "data.frame"), row.names = c(NA, 
-2L)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    一个选项将按逻辑条件的累积总和进行分组,其中“B_S”为“S2”,然后获取“High”的索引大于或等于“High”的first 值,选择前两个位置,提取行索引(.I)并根据该索引对行进行子集

    i1 <- df1[,  .I[which((High >= first(High)))[1:2]], .(grp = cumsum(B_S == "S2"))]$V1
    df1[i1]
    #               Time    High    rn B_S
    #1: 16/10/2014 09:19 1833.50 77470  S2
    #2: 16/10/2014 09:22 1852.50 77467  S1
    #3: 17/12/2014 12:59 1992.00 17758  S2
    #4: 17/12/2014 13:01 2001.25 17756  S1
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 2019-11-14
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2020-12-12
      相关资源
      最近更新 更多