【问题标题】:incremental counter within dataframe only when a condition is met in r仅当在 r 中满足条件时,数据帧内的增量计数器
【发布时间】:2021-07-17 22:14:50
【问题描述】:

我想创建一个仅在满足条件时才增加的累积增量计数器。

DT <- data.table(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2), 
               b = c(10L, 5L, 3L, 4L, 2L, 6L, 1L, 3L, 5L, 7L))

rleid 没有得到想要的结果,因为在连续行中满足两个条件时,不会执行增量

> DT[,count := rleid(b>=5),id]
> DT
    id  b count
 1:  1 10     1
 2:  1  5     1
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     4
 8:  2  3     1
 9:  2  5     2
10:  2  7     2

预期的结果是

> DT
    id  b count
 1:  1 10     1
 2:  1  5     2
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     3
 8:  2  3     1
 9:  2  5     2
10:  2  7     3

【问题讨论】:

  • 试试DT[, count := rleid(cumsum(b &gt;= 5)), by = .(id)]

标签: r data.table counter


【解决方案1】:

这是cumsum 的选项。按'id'分组,得到逻辑表达式的累计和(b &gt;= 5)。对于 'id' 2,大于或等于 5 的第一个元素位于位置 2(在分组位置),因此第一行将为 0。为了使其为 1,一个选项是将其转换为 @ 987654323@ 然后强制转换成整数,这样我们就得到整数存储值了(R索引从1开始)

DT[, count := as.integer(factor(cumsum(b >= 5))), id]

-输出

DT
    id  b count
 1:  1 10     1
 2:  1  5     2
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     3
 8:  2  3     1
 9:  2  5     2
10:  2  7     3

【讨论】:

  • 相信我一试! :D
【解决方案2】:

另一个data.table 选项与cumsum

> DT[, count := (v <- cumsum(b >= 5)) - v[1] + 1, id][]
    id  b count
 1:  1 10     1
 2:  1  5     2
 3:  1  3     2
 4:  1  4     2
 5:  1  2     2
 6:  1  6     3
 7:  1  1     3
 8:  2  3     1
 9:  2  5     2
10:  2  7     3

【讨论】:

    【解决方案3】:

    我们也可以为此使用accumulate 函数。以下是有关此解决方案的一些说明:

    • accumulate 将两个参数函数作为其.f 参数,其中.x 是前一个/累积值,.y 是向量b 的值序列中的当前值
    • 我将count 的初始值设置为1,因此删除b 的第一个值,因为我们不再需要它并通过.y 检查下一个值,如果满足条件,它将加一,否则保持原样。
    library(dplyr)
    library(purrr)
    
    DT %>%
      group_by(id) %>%
      mutate(count = accumulate(b[-1], .init = 1,
                                ~ if(.y >= 5) {
                                  .x + 1
                                } else {
                                  .x
                                }))
    
    # A tibble: 10 x 3
    # Groups:   id [2]
          id     b count
       <dbl> <int> <dbl>
     1     1    10     1
     2     1     5     2
     3     1     3     2
     4     1     4     2
     5     1     2     2
     6     1     6     3
     7     1     1     3
     8     2     3     1
     9     2     5     2
    10     2     7     3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2013-08-07
      • 2020-12-25
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多