在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
相关产品推荐
相关产品推荐

