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

在R语言长数据中按ID匹配,将列中NA替换为首次出现的值

解决方案

以下是几种高效的实现方式,根据你的数据规模和使用习惯选择即可:

方法1:dplyr(tidyverse生态,语法直观)

适合大多数常规场景,代码可读性强,属于tidyverse体系的标准数据操作方式:

library(dplyr)

# 方式1:用fill函数直接向下填充(最简洁)
data1_filled <- data1 %>%
  group_by(id) %>%
  fill(var1, var2, .direction = "down") %>%
  ungroup()

# 方式2:手动提取每组首个非NA值替换NA(逻辑更清晰)
data1_filled <- data1 %>%
  group_by(id) %>%
  mutate(across(c(var1, var2), ~replace(., is.na(.), first(na.omit(.))))) %>%
  ungroup()

方法2:data.table(高性能,适合大数据集)

如果你的数据量极大(百万级以上),data.table的处理速度会远快于dplyr:

library(data.table)

# 转换为data.table格式
setDT(data1)

# 按id分组填充缺失值
data1_filled <- data1[, c("var1", "var2") := lapply(.SD, function(x) {
  first_val <- first(na.omit(x))
  replace(x, is.na(x), first_val)
}), by = id, .SDcols = c("var1", "var2")]

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

不想加载第三方包时,用基础R的ave()函数也能完成:

data1_filled <- data1
# 处理var1
data1_filled$var1 <- ave(data1$var1, data1$id, FUN = function(x) {
  first_val <- x[!is.na(x)][1]
  replace(x, is.na(x), first_val)
})
# 处理var2
data1_filled$var2 <- ave(data1$var2, data1$id, FUN = function(x) {
  first_val <- x[!is.na(x)][1]
  replace(x, is.na(x), first_val)
})

验证填充结果

执行以下代码查看处理后的数据:

print(data1_filled)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:35:02