【问题标题】:Group data frame row by consecutive value in R [duplicate]按R中的连续值对数据框行进行分组[重复]
【发布时间】:2021-11-01 23:45:35
【问题描述】:

我需要按连续值对数据框进行分组。 例如,给定这个数据框:

tibble( time = c(1,2,3,4,5,10,11,20,30,31,32,40) )

我想要一个分组列,例如:

tibble( time = c(1,2,3,4,5,10,11,20,30,31,32,40), group=c(1,1,1,1,1,2,2,3,4,4,4,5) )

按照说明获取列组的 tidyverse(或基本 R)方法是什么?

【问题讨论】:

  • 跳过链接帖子中的split 部分。或者使用便捷功能collapse::seqid。干杯

标签: r tidyverse


【解决方案1】:

我们可以这样:

df %>%
    arrange(time) %>%
    group_by(grp = (time  %/% 10)+1) 
 time group
   <dbl> <dbl>
 1     1     1
 2     2     1
 3     3     1
 4     4     1
 5     5     1
 6    10     2
 7    11     2
 8    20     3
 9    30     4
10    31     4
11    32     4
12    40     5

【讨论】:

  • 我的错,我把连续的大约十个放在同一个地方,但这不是一般情况。所以我不得不拒绝你的回答。
【解决方案2】:

我们可以在'time'的相邻值上使用diff,检查差值是否不等于1,然后通过取累积和(cumsum)将逻辑向量更改为数字索引,这样就有每个 TRUE 值增加 1

library(dplyr)
df1 %>% 
   mutate(grp = cumsum(c(TRUE, diff(time) != 1)))

-输出

# A tibble: 12 x 2
    time   grp
   <dbl> <int>
 1     1     1
 2     2     1
 3     3     1
 4     4     1
 5     5     1
 6    10     2
 7    11     2
 8    20     3
 9    30     4
10    31     4
11    32     4
12    40     5

【讨论】:

    【解决方案3】:

    您可以使用以下解决方案:

    library(dplyr)
    library(purrr)
    
    df %>%
      mutate(grp = accumulate(2:nrow(df), .init = 1, 
                              ~ if(time[.y] - time[.y - 1] == 1) {
                                .x 
                              } else {
                                .x + 1
                              }))
    
    # A tibble: 12 x 2
        time   grp
       <dbl> <dbl>
     1     1     1
     2     2     1
     3     3     1
     4     4     1
     5     5     1
     6    10     2
     7    11     2
     8    20     3
     9    30     4
    10    31     4
    11    32     4
    12    40     5
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多