R语言:按ID统计缺失年份数量及分类统计需求
R语言计算ID的缺失年份数及分类统计
原始数据
用户提供的R语言数据框:
my_data = data.frame( id = c(111,111,111,222,222,222,222, 333,333,333,333,444,444,555), year = c(2010,2011,2012, 2015, 2019, 2020, 2021, 2010,2012, 2013, 2014, 2021, 2022,2010))
数据预览:
id year 1 111 2010 2 111 2011 3 111 2012 4 222 2015 5 222 2019 6 222 2020 7 222 2021 8 333 2010 9 333 2012 10 333 2013 11 333 2014 12 444 2021 13 444 2022 14 555 2010
需求
- 统计无缺失年份的ID数量
- 统计至少存在一个缺失年份的ID数量
- 计算每个ID的总缺失年份数(例如ID=222的缺失年份为2016、2017、2018,共3年)
解决方案
可以在分组汇总时同时计算缺失标记和总缺失年份数,再关联回原始数据,替代你之前的分步处理逻辑:
library(dplyr) # 分组计算每个ID的缺失状态和总缺失年份数 gap_summary <- my_data %>% group_by(id) %>% arrange(year) %>% # 确保年份按升序排列,避免计算错误 mutate(year_diff = year - lag(year)) %>% summarise( # 判断是否存在年份间隔 has_gap = any(year_diff > 1, na.rm = TRUE), # 计算总缺失年份:间隔大于1的部分,每个间隔减1后求和,无间隔则为0 total_missing = sum(ifelse(year_diff > 1, year_diff - 1, 0), na.rm = TRUE) ) # 关联回原始数据,处理仅含一条记录的ID my_data_final <- my_data %>% left_join(gap_summary, by = "id") %>% mutate( has_gap = ifelse(is.na(has_gap), FALSE, has_gap), total_missing = ifelse(is.na(total_missing), 0, total_missing) )
最终输出
# A tibble: 14 x 4 id year has_gap total_missing <dbl> <dbl> <lgl> <dbl> 1 111 2010 FALSE 0 2 111 2011 FALSE 0 3 111 2012 FALSE 0 4 222 2015 TRUE 3 5 222 2019 TRUE 3 6 222 2020 TRUE 3 7 222 2021 TRUE 3 8 333 2010 TRUE 1 9 333 2012 TRUE 1 10 333 2013 TRUE 1 11 333 2014 TRUE 1 12 444 2021 FALSE 0 13 444 2022 FALSE 0 14 555 2010 FALSE 0
统计两类ID数量
运行以下代码即可得到所需统计结果:
# 无缺失年份的ID数量 sum(!gap_summary$has_gap) # 输出:3(对应ID 111、444、555) # 至少存在一个缺失年份的ID数量 sum(gap_summary$has_gap) # 输出:2(对应ID 222、333)
逻辑说明
total_missing:对每个ID,先计算相邻年份的差值,差值大于1时,用差值减1得到该段的缺失年份数(比如2015到2019差值为4,减1后得到3个缺失年份:2016、2017、2018),最后将所有段的缺失数求和。- 仅含一条记录的ID,默认无缺失年份,
has_gap设为FALSE,total_missing设为0。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

