Select 匹配列时匹配非 NA 值

Select non NA values in match when matching columns

我有两个 data.frameaabb:

    aa <- data.frame(ID = c(rep(letters[1:4]),"d","d", "e","e"), Name = c("Dave", "Charlie", "Ella", NA,"Timothy","James",NA, "Bob"))
aa
  ID    Name
1  a    Dave
2  b Charlie
3  c    Ella
4  d    <NA>
5  d Timothy
6  d   James
7  e    <NA>
8  e     Bob

bb <- data.frame(ID = rep(letters[1:5]),Name = 0)

 bb
  ID Name
1  a    0
2  b    0
3  c    0
4  d    0

我想通过将 bb$IDaa$ID 匹配来填充 bb$Name,以便我得到字母表中最早的名字(在本例中为 James):

 ID    Name
1  a    Dave
2  b Charlie
3  c    Ella
4  d   James
5  e    Bob

但是,如果我尝试 bb$Name <- aa[match(bb$ID,aa$ID),2],我会得到:

bb

     ID    Name
1  a    Dave
2  b Charlie
3  c    Ella
4  d    <NA>
5  e    <NA>

您是否认为一些 if 语句代码如下:如果 aa$ID 中有超过 1 个相同的值,并且如果其中一个值是 NA,则 select 按字母顺序排列较早的那个。所以 bb$Name 中的 d 值将是 James

我知道我可以对原始数据进行子集化,但我不想在我的实际数据中这样做,因为 aa$Name 具有 NA 值的信息很重要

创建 aa 的临时副本可以吗?

tmp <- aa[!is.na(aa$Name),]
tmp <- tmp[order(tmp$Name),]
bb$Name <- tmp[match(bb$ID,tmp$ID),2]
bb

这会得到你想要的结果。