我正在尝试组合一个不相等的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))
)
Run Code Online (Sandbox Code Playgroud)
我可以看到我需要在最长的data.frame中找到最大列数; 我可以使用以下代码执行此操作,
max(sapply(df.lst,ncol))
Run Code Online (Sandbox Code Playgroud)
但在那之后我被困住了.建议可以对列表进行索引,并自动用NAs 填充它.
一旦我有了填充列表,我预计会有一个do.call()如前所述的简单.(我试图保留基础R的答案,虽然有许多类似的问题我似乎无法找到这个精确答案的答案).
如果你想坚持使用基础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
Run Code Online (Sandbox Code Playgroud)
我们可以用
library(dplyr)
bind_rows(df.lst)
Run Code Online (Sandbox Code Playgroud)
要么
library(data.table)
rbindlist(df.lst, fill=TRUE)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |