我有一个巨大的数据集,其结构与此类似:
FMID <- c(101,101,102,102,103,103,104,104)
IID <- c("101A","101B", "102A", "102B", "103A", "103B","104A", "1034")
PC1 <- c(2,NA,3,4,NA,4,NA,3)
ZY <- c(1,1,1,1,3,3,1,1)
df <- as.data.frame(cbind(FMID,IID, PC1, ZY))
我需要复制变量 PC1 中的一些值
因此,对于具有相同 FMID 且 ZY==1 的情况(如果其中一个 A 或 B 具有 NA),我想使用具有相同 FMID 的其他情况的信息来填充 NA。
这里是预期结果:
FMID <- c(101,101,102,102,103,103)
IID <- c("101A","101B", "102A", "102B", "103A", "103B","104A", "1034")
PC1 <- c(2,2,3,4,NA,4,3,3)
ZY <- c(1,1,1,1,3,3,1,1)
df_Expected <- as.data.frame(cbind(FMID,IID, PC1, ZY))
我尝试过 ifelse 但无法使其工作。提前非常感谢您。
您可以使用
tidyr::fill
。请注意,使用 .direction = "down"
可以防止用 NA 值之后的值填充 NA。如果您希望这些 NA 也被填充(如第 5 行中的观察),您可以使用 .direction = "updown"
。
library(tidyr)
library(dplyr)
df |>
group_by(FMID, ZY) |>
fill(PC1, .direction = "down") |>
ungroup()
# FMID IID PC1 ZY
# 1 101 101A 2 1
# 2 101 101B 2 1
# 3 102 102A 3 1
# 4 102 102B 4 1
# 5 103 103A <NA> 3
# 6 103 103B 4 3