如何基于邻近值填充dataframe中的NA值(等距时取均值)
解决方案
可以通过结合前向填充、后向填充以及距离计算来实现需求,具体逻辑如下:
- 先为每个位置记录前后最近的非NA值
- 计算每个位置到前后非NA值的距离
- 根据距离关系填充缺失值:距离前值更近则取前值,距离后值更近则取后值,距离相等则取两者均值
使用dplyr和tidyr实现的代码如下:
library(dplyr) library(tidyr) # 原始数据 data <- data.frame(x = c(2, 3, 3, NA, NA, 4, NA, 3, 2, NA, NA, NA, 4)) # 处理缺失值生成y列 data_processed <- data %>% mutate( # 前向填充:取前面最近的非NA值 ffill = fill(x, .direction = "down")$x, # 后向填充:取后面最近的非NA值 bfill = fill(x, .direction = "up")$x, # 计算到前一个非NA值的距离 dist_ffill = ifelse(!is.na(x), 0, lag(dist_ffill, default = 0) + 1), # 计算到后一个非NA值的距离 dist_bfill = ifelse(!is.na(x), 0, lead(dist_bfill, default = 0) + 1) ) %>% mutate( y = case_when( !is.na(x) ~ x, dist_ffill < dist_bfill ~ ffill, dist_ffill > dist_bfill ~ bfill, TRUE ~ (ffill + bfill) / 2 ) ) %>% select(x, y) # 保留需要的列 # 查看结果 print(data_processed)
运行后得到的结果与示例完全一致:
| x | y |
|---|---|
| 2 | 2 |
| 3 | 3 |
| 3 | 3 |
| NA | 3 |
| NA | 4 |
| 4 | 4 |
| NA | 3.5 |
| 3 | 3 |
| 2 | 2 |
| NA | 2 |
| NA | 3 |
| NA | 4 |
| 4 | 4 |
内容的提问来源于stack exchange,提问作者Miquel Vallbona
相关产品推荐
相关产品推荐

