首页 文章

梳理一份不相等的data.frames列表

提问于
浏览
1

我正在尝试合并一组不相等的data.frames;显而易见的 do.call(rbind, df.lst) 失败但真正的问题是用 NA 填充它 .

df.lst <- list(A=data.frame(a=c(1,2),b=c(5,4),d=c(2,3),e=c(1,1),f=c(1,2),g=c(1,2)),
               B=data.frame(a=c(1,2),b=c(3,2),d=c(2,3)),
               C=data.frame(a=c(1,2),b=c(4,3),d=c(1,2),e=c(1,3))
               )

我可以看到我需要在最长的data.frame中找到最大列数;我可以使用以下代码执行此操作,

max(sapply(df.lst,ncol))

但在那之后我被困住了 . 建议可以对列表进行索引,并使用 NA 自动填充它 .

一旦我有了填充列表,我预计会有一个简单的 do.call() ,如前所述 . (我似乎找到了这个精确答案的答案) .

3 回答

  • 6

    如果你想坚持使用基础R,你可以这样做:

    ### Get all the columns names
    col <- unique(unlist(sapply(df.lst, names)))
    col
    ## [1] "a" "b" "d" "e" "f" "g"
    
    ### Fill the missing columns with NA
    df.lst <- lapply(df.lst, function(df) {
      df[, setdiff(col, names(df))] <- NA
      df
    })
    
    ### Then Bind it
    do.call(rbind, df.lst)
    ##     a b d  e  f  g
    ## A.1 1 5 2  1  1  1
    ## A.2 2 4 3  1  2  2
    ## B.1 1 3 2 NA NA NA
    ## B.2 2 2 3 NA NA NA
    ## C.1 1 4 1  1 NA NA
    ## C.2 2 3 2  3 NA NA
    
  • 4

    我们可以用

    library(dplyr)
    bind_rows(df.lst)
    

    要么

    library(data.table)
    rbindlist(df.lst, fill=TRUE)
    
  • 7

    尝试

    library(plyr)
    ldply(df.lst,data.frame)
    
      .id a b d  e  f  g
    1   A 1 5 2  1  1  1
    2   A 2 4 3  1  2  2
    3   B 1 3 2 NA NA NA
    4   B 2 2 3 NA NA NA
    5   C 1 4 1  1 NA NA
    6   C 2 3 2  3 NA NA
    

    如果需要,您可以删除第一列:

    df<-ldply(df.lst,data.frame)
    df[,-1]
    
    a b d  e  f  g
    1 1 5 2  1  1  1
    2 2 4 3  1  2  2
    3 1 3 2 NA NA NA
    4 2 2 3 NA NA NA
    5 1 4 1  1 NA NA
    6 2 3 2  3 NA NA
    

相关问题