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

如何在一列中填充匹配值间的缺失值,非匹配值间不填充?

匹配值间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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:47:33