R语言按id分组判断type列第二行后变化及统计变化次数
R数据框按id分组统计type列变化实现方案
需求说明
- 每个分组内前两行的
change_of_type_after_2nd_row字段标记为NA,第二行之后的每一行对比前一行type取值,变化标记为yes,未变化标记为No - 统计每个分组内第二行之后
type列的总变化次数,同分组所有行的count值保持一致
示例数据
data <- data.frame( id = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5), type = c("1e","1e","2d","2h","1c","1c","1e","2d","2h","2j","1e", "1e","2e","1e","1e","2h","1c","1c","1c", "1j","1j") )
实现代码(dplyr版)
这是最简洁易读的实现方式,依赖tidyverse生态的dplyr包:
# 未安装依赖包先执行:install.packages("dplyr") library(dplyr) result <- data %>% # 按id字段分组 group_by(id) %>% mutate( # 计算当前行与上一行type是否存在差异 type_diff = type != lag(type), # 生成变化标记列 change_of_type_after_2nd_row = case_when( row_number() <= 2 ~ NA_character_, type_diff ~ "yes", TRUE ~ "No" ), # 统计分组内第二行之后的总变化次数 count = sum(type_diff[row_number() > 2], na.rm = TRUE) ) %>% # 移除中间计算用的辅助列 select(-type_diff) %>% ungroup()
结果验证
运行上述代码后得到的result与期望输出完全匹配:
- id=1分组总变化次数为2,第三、四行均标记为yes
- id=3分组总变化次数为3,第五行因type未变化标记为No
- id=4、5分组无变化,count值为0
内容的提问来源于stack exchange,提问作者berehan
相关产品推荐
相关产品推荐

