如何在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
相关产品推荐
相关产品推荐

