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

如何在R语言数据框中用前4行非缺失值填充NA

R语言按分组向前填充缺失值

问题描述

现有如下结构的数据框,需要为每个maker对应的num列缺失值,填充该maker最近的非缺失值(即向前填充最近的同组非NA值):

示例数据:

df <- data.frame(
  maker = rep(paste0("local_", 1:4), 5),
  num = c(1,2,5,6,NA,NA,NA,NA,4,7,8,9,NA,NA,NA,NA,NA,NA,NA,NA)
)

预期结果:每个maker的NA值会被其最近的上方非NA值填充,比如local_1的第5、13、17行NA会分别填充为1、4、4,与示例预期一致。


解决方案

方法1:dplyr + tidyr 实现(简洁直观)

通过按maker分组,使用fill()函数向前填充缺失值:

library(dplyr)
library(tidyr)

filled_df <- df %>%
  group_by(maker) %>%
  fill(num, .direction = "down") %>% # .direction = "down" 表示向下填充(向前)
  ungroup()

print(filled_df)

方法2:data.table 实现(大数据高效)

如果处理的是大型数据集,data.table的操作效率更高:

library(data.table)

setDT(df)
filled_df <- df[, num := nafill(num, type = "locf"), by = maker] # locf = Last Observation Carried Forward

print(filled_df)

方法3:基础R实现(无需额外包)

用ave()结合自定义函数完成分组填充:

# 定义向前填充函数
locf_fill <- function(x) {
  non_na_idx <- which(!is.na(x))
  if (length(non_na_idx) == 0) return(x)
  fill_pos <- findInterval(seq_along(x), non_na_idx)
  x[non_na_idx[fill_pos]]
}

filled_df <- df
filled_df$num <- ave(filled_df$num, filled_df$maker, FUN = locf_fill)

print(filled_df)

内容的提问来源于stack exchange,提问作者RockMyAlgorithm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:43:20