代码之家  ›  专栏  ›  技术社区  ›  Bonono

在匹配列时选择匹配中的非NA值

  •  1
  • Bonono  · 技术社区  · 8 年前

    我有两个 data.frame s aa bb :

        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$Name 通过匹配 bb$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 ,然后选择要匹配的字母顺序较早的字母。所以 d 詹姆斯

    aa$Name NA 价值是重要的

    1 回复  |  直到 8 年前
        1
  •  2
  •   A.Yazdiha    8 年前

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

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

    这会得到你想要的结果。