【问题标题】:How to label consecutive data points (clusters) as different groups如何将连续的数据点(集群)标记为不同的组
【发布时间】:2021-07-18 23:21:36
【问题描述】:

我想将同一属性(在本例中为“TRUE”)的连续数据点标记为不同的组(例如,Group1、Group2、...)。

以下是示例数据:

dt <- data.frame(value = c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE))

“组”列是我想要实现的:

 value group
  TRUE    G1
  TRUE    G1
 FALSE  <NA>
 FALSE  <NA>
  TRUE    G2
 FALSE  <NA>
  TRUE    G3
  TRUE    G3
  TRUE    G3
  TRUE    G3

【问题讨论】:

    标签: r


    【解决方案1】:

    base R中,我们可以使用rle

    dt$group <- inverse.rle(within.list(rle(dt$value), {
              values <- NA^!values
         values[!is.na(values)] <- paste0("G", seq_along(values[!is.na(values)]))}))
    

    -输出

    dt
       value group
    1   TRUE    G1
    2   TRUE    G1
    3  FALSE  <NA>
    4  FALSE  <NA>
    5   TRUE    G2
    6  FALSE  <NA>
    7   TRUE    G3
    8   TRUE    G3
    9   TRUE    G3
    10  TRUE    G3
    

    或者更紧凑的选项

    library(dplyr)
    library(stringr)
    dt %>% 
       mutate(group = str_c('G', cumsum(c(TRUE, diff(value) > 0)) * NA^!value))
       value group
    1   TRUE    G1
    2   TRUE    G1
    3  FALSE  <NA>
    4  FALSE  <NA>
    5   TRUE    G2
    6  FALSE  <NA>
    7   TRUE    G3
    8   TRUE    G3
    9   TRUE    G3
    10  TRUE    G3
    

    rleid 来自data.table

    library(data.table)
    setDT(dt)[, tmp := rleid(value)][(value), 
         group := paste0("G", .GRP), tmp][, tmp := NULL][]
        value group
     1:  TRUE    G1
     2:  TRUE    G1
     3: FALSE  <NA>
     4: FALSE  <NA>
     5:  TRUE    G2
     6: FALSE  <NA>
     7:  TRUE    G3
     8:  TRUE    G3
     9:  TRUE    G3
    10:  TRUE    G3
    

    【讨论】:

      【解决方案2】:

      rle 的另一个选项 -

      dt$group <-  paste0('G', with(rle(dt$value), rep(cumsum(values), lengths)))
      dt$group[!dt$value] <- NA
      dt
      
      #   value group
      #1   TRUE    G1
      #2   TRUE    G1
      #3  FALSE  <NA>
      #4  FALSE  <NA>
      #5   TRUE    G2
      #6  FALSE  <NA>
      #7   TRUE    G3
      #8   TRUE    G3
      #9   TRUE    G3
      #10  TRUE    G3
      

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 2017-01-13
        • 2020-11-03
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2016-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多