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

时间:2015-11-18 11:43:00

标签: r

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

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()。 (我试图保留基础R的答案,虽然有许多类似的问题我似乎无法找到这个精确的答案)。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

我们可以使用

library(dplyr)
bind_rows(df.lst)

或者

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

答案 2 :(得分:4)

尝试

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

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

SQL Server