如何按组按特定规则用序列填充数据中的NA值?
按组填充NA值的解决方案
输入数据
ID Count 1 0 1 1 1 NA 1 2 1 NA 1 NA 1 NA 1 NA 1 NA 2 0 2 NA 2 NA 2 3
需求说明
每个ID的首行值为0,按ID分组填充Count列的NA值:
- 若NA前后均有有效值,填充为从NA前的数值到NA后首个数值的递增序列
- 若NA后无有效值,从NA前的最后一个有效值开始依次递增填充
R语言实现(基于dplyr)
library(dplyr) # 构造输入数据集 df <- tibble( ID = c(1,1,1,1,1,1,1,1,1,2,2,2,2), Count = c(0,1,NA,2,NA,NA,NA,NA,NA,0,NA,NA,3) ) # 分组处理填充逻辑 df_filled <- df %>% group_by(ID) %>% mutate( # 将连续NA与前后有效值划分为不同分段 segment = cumsum(!is.na(Count)), # 获取每个NA对应的前、后有效值 prev_val = ifelse(is.na(Count), lag(Count, na.rm = TRUE), Count), next_val = ifelse(is.na(Count), lead(Count, na.rm = TRUE), Count), # 生成填充序列 Count = case_when( # 保留原始非NA值 !is.na(Count) ~ Count, # 前后都有值:生成从prev到next的等长递增序列 !is.na(next_val) ~ seq(prev_val, next_val, length.out = n()), # 后面无值:从最后一个有效值开始依次递增 TRUE ~ prev_val + row_number() - max(which(!is.na(Count))) ) ) %>% # 清理辅助列 select(-segment, -prev_val, -next_val) %>% ungroup() # 输出结果 print(df_filled)
输出结果
# A tibble: 13 × 2 ID Count <dbl> <dbl> 1 1 0 2 1 1 3 1 1 4 1 2 5 1 3 6 1 4 7 1 5 8 1 6 9 1 7 10 2 0 11 2 1 12 2 2 13 2 3
内容的提问来源于stack exchange,提问作者RandomThinker
相关产品推荐
相关产品推荐

