如何用另一行的信息填充一行

问题描述 投票:0回答:1

我有一个巨大的数据集,其结构与此类似:

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 但无法使其工作。提前非常感谢您。

r dplyr tidyverse
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.