如何在一列中填充匹配值间的缺失值,非匹配值间不填充?
匹配值间NA填充需求的解决方案
问题背景
原始数据框:
df <- data.frame(x= c(NA,1, NA, NA, 1, NA, 2, NA, NA, 2, NA, 3, NA, 3, NA), time = c(1:15))
需要实现:仅填充相同数值之间的NA,不同数值(如1和2)之间的NA保留不填充。期望得到的x列结果为:
x = c(NA,1, 1, 1, 1, NA, 2, 2, 2, 2, NA, 3, 3, 3, NA)
尝试过tidyr::fill()函数,但该函数会填充所有连续的NA,无法区分匹配值与非匹配值区间,不符合需求。
解决方案代码
使用dplyr包实现分组填充:
library(dplyr) df_filled <- df %>% # 创建分组标识:每个新的非NA值(与前值不同)开启新分组 mutate(group = cumsum(!is.na(x) & (is.na(lag(x)) | lag(x) != x))) %>% # 按分组双向填充NA group_by(group) %>% fill(x, .direction = "downup") %>% ungroup() %>% # 移除临时分组列 select(-group) # 查看填充后的x列 print(df_filled$x)
代码逻辑说明
- 分组标识:通过
cumsum()生成分组编号,仅当遇到**非NA且与前一个值不同(或前一个是NA)**的元素时,分组编号递增,确保相同数值的连续区间(含中间NA)被归为同一组。 - 双向填充:在每个分组内使用
fill(.direction = "downup"),同时向下和向上填充NA,让组内所有NA替换为该组的非NA值。 - 最终移除临时分组列,得到符合要求的时间序列数据。
内容的提问来源于stack exchange,提问作者Juiceboxxx
相关产品推荐
相关产品推荐

