You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中按ID分组生成当前行与下一行group列的匹配结果

解决R语言中按连续ID分组处理相邻行Group值的问题

这问题我熟!要实现按连续相同ID分组,把当前行的group值作为group1,下一行的group值作为group2,且分组内最后一行的group2填充为-,咱们用tidyverse工具就能轻松搞定,先理清楚关键点:

  • 分组依据是连续的相同ID(比如示例里后面出现的ID=1是独立的新组,不能和前面的ID=1合并)
  • 行顺序由timestamp确定,处理前一定要确保数据按timestamp列排序(如果你的数据里有这个列的话)

步骤1:加载工具包并创建示例数据

首先加载dplyr包,然后用你提供的示例数据:

library(dplyr)

# 示例数据
id <- c(1,1,1,1,2,2,1,1)
group <- c("a","b","c","d","a","b","c","d")
df <- data.frame(id, group)

步骤2:处理数据生成目标列

核心思路是先创建连续分组的标识,再按这个分组用lead()函数获取下一行的group值,最后把分组最后一行的空值替换为-:

df_processed <- df %>%
  # 生成连续分组ID:当当前行ID和上一行不同时,分组号+1
  mutate(grp = cumsum(id != lag(id, default = first(id)))) %>%
  # 按连续分组处理
  group_by(grp) %>%
  mutate(
    group1 = group,
    # lead()获取下一行的group值,最后一行自动用"-"填充
    group2 = lead(group, default = "-")
  ) %>%
  # 取消分组,去掉临时的grp列,保留需要的列
  ungroup() %>%
  select(id, group1, group2)

步骤3:查看结果

运行print(df_processed)就能得到你期望的结果:

# A tibble: 8 × 3
     id group1 group2
  <dbl> <chr>  <chr> 
1     1 a      b     
2     1 b      c     
3     1 c      d     
4     1 d      -     
5     2 a      b     
6     2 b      -     
7     1 c      d     
8     1 d      -     

补充:如果有timestamp列

如果你的数据包含timestamp列,一定要先按它排序,保证行顺序正确:

df <- df %>% arrange(timestamp)

内容的提问来源于stack exchange,提问作者Rana Usman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:52:55