如何在R中用相邻已知值的统一平均值填充数据列内的NA值
R实现固定间隔NA统一替换为相邻实测值均值
需求说明
数据集每两个实测值之间固定间隔10个NA,要求所有中间NA统一替换为前后两个实测值的平均值,而非线性渐变插值。
实现代码
# 未安装依赖包先运行:install.packages(c("dplyr", "tidyr")) library(dplyr) # 读入示例原始数据 rc_data <- structure(list(sample_id = c("REFTTO_IS_211201_1_b", "ARL2108200_b", "ARL2108201_b", "ARL2108202_b", "ARL2108203_b", "ARL2108204_b", "ARL2108205_b", "ARL2108206_b", "ARL2108207_b", "ARL2108208_b", "ARL2108209_b", "REFTTO_IS_211201_2", "ARL2108210_b", "ARL2108211_b", "ARL2108212_b", "ARL2108213_b", "ARL2108214_b", "ARL2108215_b", "ARL2108216_b", "ARL2108217_b", "ARL2108218_b", "ARL2108219_b", "REFTTO_IS_211201_3", "REFTTO_IS_211203_1", "ARL2108220", "ARL2108221", "ARL2108222", "ARL2108223", "ARL2108224", "ARL2108225", "ARL2108226", "ARL2108227", "ARL2108228", "ARL2108229", "REFTTO_IS_211203_2", "ARL2108230", "ARL2108231", "ARL2108232", "ARL2108233", "ARL2108234", "ARL2108235", "ARL2108236", "ARL2108237", "ARL2108238", "ARL2108239", "REFTTO_IS_211203_3", "REFTTO_IS_211206_1", "ARL2108240", "ARL2108241", "ARL2108242", "ARL2108243", "ARL2108244", "ARL2108245", "ARL2108246", "ARL2108247", "ARL2108248", "ARL2108249", "REFTTO_IS_211206_2", "ARL2108250", "ARL2108251", "ARL2108252", "ARL2108253", "ARL2108254", "ARL2108255", "ARL2108256", "ARL2108258", "ARL2108259", "REFTTO_IS_211206_3" ), response_coefficient = c("1.09785865302384", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.09822862814289", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.09835314677401", "1.09942926690693", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.10084276861106", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.10078178211056", "1.11104600880183", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11203467893562", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "1.11344223852824" )), class = "data.frame", row.names = c(NA, -68L)) # 第一步:将响应系数列转为数值型,把字符串"NA"转为真实缺失值 rc_data <- rc_data %>% mutate(response_coefficient = as.numeric(response_coefficient)) # 第二步:给每一段(实测值+后面10个NA)打分组标签 rc_data <- rc_data %>% mutate(group = cumsum(!is.na(response_coefficient))) # 第三步:统一替换同组NA为首尾实测值均值 rc_result <- rc_data %>% group_by(group) %>% mutate( segment_avg = (first(response_coefficient) + lead(first(response_coefficient), 1))/2, response_coefficient_filled = ifelse(is.na(response_coefficient), segment_avg, response_coefficient) ) %>% ungroup() %>% select(-group, -segment_avg)
逻辑说明
- 先按实测值的位置对数据分段,每一段包含1个实测值和后面紧接的10个NA
- 每段统一计算首尾两个实测值的均值,整段所有NA都用该均值填充,完全满足同一段10个NA取值完全一致的要求
- 原始实测值不会被修改,仅替换缺失值
- 如果需要处理首尾超出实测值范围的NA,可自行调整
lead参数补充首尾填充规则
内容的提问来源于stack exchange,提问作者Phenomniverse
相关产品推荐
相关产品推荐

