【问题标题】:Combing a list of unequal data.frames组合不相等的data.frames列表
【发布时间】:2015-11-18 11:43:00
【问题描述】:

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

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))

但在那之后我被困住了。建议可以对列表进行索引,这会自动用NAs 填充它。

一旦我有了填充列表,我预计会有一个简单的do.call(),如前所述。 (我试图保留对基础 R 的答案,虽然有很多类似的问题,但我似乎无法找到这个精确问题的答案。

【问题讨论】:

  • dplyr尝试library(data.table); rbindlist(df.lst, fill=TRUE)bind_rows(df.lst)

标签: r


【解决方案1】:

如果你想坚持使用 base 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

【讨论】:

  • 紧跟在 NA 之后的 'df' 有什么作用?
  • 如果您希望lapply 按您的意愿修改每个data.frame,您需要在函数调用结束时返回更改后的data.frame(用NA 估算)。跨度>
  • 它适用于我的假数据集,但不适用于我的真实数据集,我需要用 dput 提出一个新问题吗?
【解决方案2】:

我们可以使用

library(dplyr)
bind_rows(df.lst)

或者

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

【讨论】:

    【解决方案3】:

    试试

    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
    

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多