如何用每行最后一个非空值填充dataframe/datatable的行末空单元格?
用每行最后一个非空值填充行末空单元格
输入数据
ID Var1 Var2 Var3 1 2 5 1 2 12 3 3 8 4 4
数据构造代码
# data.frame 构造 d <- data.frame( ID = 1:4, Var1 = c(2, 12, 8, 4), Var2 = c(5, 3, NA, NA), Var3 = c(1, NA, NA, NA) ) # data.table 构造 library(data.table) d <- fread(" ID Var1 Var2 Var3 1 2 5 1 2 12 3 NA 3 8 NA NA 4 4 NA NA ")
需求说明
所有空单元格(NA)都位于每行末尾,需要用每行最后一个非NA值填充该行的所有空单元格,最终效果如下:
ID Var1 Var2 Var3 1 2 5 1 2 12 3 3 3 8 8 8 4 4 4 4
解决方案
1. Base R 实现(无需额外包)
通过apply逐行处理,提取每行最后一个非NA值后替换该行的NA:
# 逐行处理数据 filled_d <- t(apply(d, 1, function(row) { # 获取当前行最后一个非NA值 last_valid <- tail(row[!is.na(row)], 1) # 替换该行所有NA replace(row, is.na(row), last_valid) })) # 转换回data.frame格式(保持原数据类型) filled_d <- as.data.frame(filled_d, stringsAsFactors = FALSE)
2. data.table 实现(高效逐行处理)
利用data.table的分组逐行操作,针对每行提取最后一个有效值填充NA:
library(data.table) setDT(d) # 按ID分组(每行一组),处理Var1-Var3列 d[, c("Var1", "Var2", "Var3") := { row_data <- unlist(.SD) last_valid <- tail(row_data[!is.na(row_data)], 1) replace(row_data, is.na(row_data), last_valid) }, by = ID, .SDcols = c("Var1", "Var2", "Var3")]
内容的提问来源于stack exchange,提问作者user24031531
相关产品推荐
相关产品推荐

