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

如何用Wave 2的值替换Wave 3中的NA值?(R语言场景)

用对应id的wave=2行值替换wave=3行的NA值

首先,你的数据框构建代码如下:

wave <- c(1, 2, 3, 1, 2, 3, 1, 2, 1, 2)
id   <- c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4)
var1 <- c(6.341464, 13.206567, NA, 5.272296,2.746650, NA, 1.684472,1.874200, 15.861959, 3.938463)
var2 <- c(6.341464, 13.206567, NA, 5.272296,2.746650, NA, 1.684472,1.874200, 15.861959, 3.938463)
var3 <- c(6.341464, 13.206567, NA, 5.272296,2.746650, NA, 1.684472,1.874200, 15.861959, 3.938463)
df <- data.frame(wave, id, var1, var2, var3)

以下是几种可行的解决方案:

方法1:dplyr(tidyverse 风格)

适合习惯tidyverse语法的用户,代码简洁易读:

library(dplyr)

df_filled <- df %>%
  group_by(id) %>%
  mutate(
    across(starts_with("var"), ~ ifelse(wave == 3 & is.na(.), .[wave == 2], .))
  ) %>%
  ungroup()
  • 逻辑:按id分组,对所有以var开头的列,判断当wave=3且值为NA时,替换为同组内wave=2的对应值,否则保留原值。

方法2:data.table(高效处理大数据)

如果数据量较大,data.table的性能更优:

library(data.table)

setDT(df)
# 提取所有wave=2的行作为匹配数据源
wave2_data <- df[wave == 2, .(id, var1, var2, var3)]
# 匹配id,更新wave=3行的var列
df[wave == 3, c("var1", "var2", "var3") := wave2_data[.SD, on = "id", .(var1, var2, var3)]]

方法3:基础R(无需第三方包)

修正你尝试的for循环方案,确保索引匹配正确:

# 定位所有wave=3的行
wave3_rows <- which(df$wave == 3)

for (row in wave3_rows) {
  current_id <- df$id[row]
  # 找到对应id的wave=2行
  wave2_row <- which(df$id == current_id & df$wave == 2)
  # 替换var列的值
  df[row, c("var1", "var2", "var3")] <- df[wave2_row, c("var1", "var2", "var3")]
}

执行任意一种方法后,你可以通过print(df)查看结果:wave=3的行已被对应id的wave=2行值替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:23:12