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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:28:08