【问题标题】:Group rows based on consecutive line numbers根据连续的行号对行进行分组
【发布时间】:2021-03-26 09:33:43
【问题描述】:

我有一个数据框,其中一列表示文本lines,它们只是部分连续的:

df <- data.frame(
  line = c("0001","0002", "0003", "0011","0012","0234","0235","0236")
)

我想根据连续的行号对行进行分组以获得这个预期结果

df
  line grp
1 0001   1
2 0002   1
3 0003   1
4 0011   2
5 0012   2
6 0234   3
7 0235   3
8 0236   3

我尝试使用dplyrlag 函数来解决这个问题,但被困在那里:

library(dplyr)
df %>%
  mutate(line = as.numeric(line),
         diff = abs(lag(line) - line))

【问题讨论】:

标签: r dplyr


【解决方案1】:

将数字转换为数字,计算连续数字之间的差值,当差值大于 1 时增加组计数。

transform(df, group = cumsum(c(TRUE, diff(as.numeric(line)) > 1)))

#  line group
#1 0001     1
#2 0002     1
#3 0003     1
#4 0011     2
#5 0012     2
#6 0234     3
#7 0235     3
#8 0236     3

如果你想使用dplyr

library(dplyr)
df %>% mutate(group = cumsum(c(TRUE, diff(as.numeric(line)) > 1)))

【讨论】:

    【解决方案2】:

    这行得通吗:

    library(dplyr)
    library(stringr)
    library(data.table)
    df %>% mutate(z = str_count(line, '0'), grp = rleid(z)) %>% select(-z)
      line grp
    1 0001   1
    2 0002   1
    3 0003   1
    4 0011   2
    5 0012   2
    6 0234   3
    7 0235   3
    8 0236   3
    

    【讨论】:

    • 这很聪明,但只有在 line 中以 0 的数量区分组时才有效,玩具数据中是这种情况,但实际数据中是这种情况。
    猜你喜欢
    • 2021-12-05
    • 2016-01-27
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    相关资源
    最近更新 更多