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

