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

用具有相同变量的值填充NA的行。

r
  •  3
  • Mal_a  · 技术社区  · 6 年前

    我将根据样本数据向你解释我的问题。这是第一张桌子 (DF1) :

      x x1 y  z
    1 1 10 a 11
    2 3 11 b 13
    3 5 10 c 15
    4 7 11 d 17
    5 9 10 e 19
    

    这是一个 dput() 版本:

    structure(list(x = c(1, 3, 5, 7, 9), x1 = c(10, 11, 10, 11, 10
    ), y = structure(1:5, .Label = c("a", "b", "c", "d", "e"), class = "factor"), 
        z = c(11, 13, 15, 17, 19)), .Names = c("x", "x1", "y", "z"
    ), row.names = c(NA, -5L), class = "data.frame")
    

    第二张桌子 (DF2) :

      x x1
    1 2 10
    2 3 60
    

    dp-() :

    structure(list(x = c(2, 3), x1 = c(10, 60)), .Names = c("x", 
    "x1"), row.names = c(NA, -2L), class = "data.frame")
    

    我现在需要绑定这两个表的行,并用来自的值填充缺少的列值。 DF1 . 让我根据这两张桌子向你解释一下。

    一开始我用 smartbind() 函数来自 gtools 图书馆:

    library(gtools)
    data <- smartbind(df1, df2)
    

    我得到的结果是:

     x x1    y  z
     1 10    a 11
     3 11    b 13
     5 10    c 15
     7 11    d 17
     9 10    e 19
     2 10 <NA> NA
     3 60 <NA> NA
    

    因此,我想用df1值填充df2行中出现的所有na值,如果 X是一样的 . 在这种情况下,应该是这样的:

     x x1    y  z
     1 10    a 11
     3 11    b 13
     5 10    c 15
     7 11    d 17
     9 10    e 19
     2 10 <NA> NA
     3 60    b 13
    

    在我的原始数据集中,我确实有大约280列!谢谢你的帮助

    有没有比连接两个数据帧然后使用rbind()更优雅的方法呢?

    2 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    tidyverse

    library(tidyverse)
    df1 %>% 
       select(-x1) %>% 
       right_join(df2) %>%
       bind_rows(df1, .)
    #  x x1    y  z
    #1 1 10    a 11
    #2 3 11    b 13
    #3 5 10    c 15
    #4 7 11    d 17
    #5 9 10    e 19
    #6 2 10 <NA> NA
    #7 3 60    b 13
    

    data.table

    nm1 <- setdiff(names(df1), c('x', 'x1'))
    setDT(df2)[df1, (nm1) := mget(nm1), on = .(x)]
    rbind(df1, df2)
    #   x x1    y  z
    #1: 1 10    a 11
    #2: 3 11    b 13
    #3: 5 10    c 15
    #4: 7 11    d 17
    #5: 9 10    e 19
    #6: 2 10 <NA> NA
    #7: 3 60    b 13
    
        2
  •  5
  •   tyumru    6 年前

    y z x

    df2 = merge(df2,df1[,c("x","y","z")],by="x",all.x=T)
    

    > rbind(df1,df2)
      x x1    y  z
    1 1 10    a 11
    2 3 11    b 13
    3 5 10    c 15
    4 7 11    d 17
    5 9 10    e 19
    6 2 10 <NA> NA
    7 3 60    b 13