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

如何用每行最后一个非空值填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:43:31