匹配列时,在匹配项中选择非NA值

时间:2016-10-27 11:39:30

标签: r match subset col

我有两个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$Namebb$ID匹配来填充aa$ID,以便我获得字母表中最早的名称(在本例中为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中有多个相同的值,并且其中一个值为NA,则选择一个具有较早的字母顺序以匹配。因此,bb $ Name中的d值为James

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

1 个答案:

答案 0 :(得分:2)

是否可以创建aa的临时副本?

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

这可以获得你想要的结果。