R 梳理不相等数据帧的列表
我正在尝试合并一个不相等数据帧的列表;明显的R 梳理不相等数据帧的列表,r,R,我正在尝试合并一个不相等数据帧的列表;明显的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
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))
)
但在那之后我就被卡住了。建议可以对列表进行索引,这样会自动用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))
)
一旦我有了填充列表,我预期会出现一个简单的do.call()
,如前所述。(我试图把答案保留在R的基础上,尽管有许多类似的问题,但我似乎找不到这个精确问题的答案)。试试看
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
df我们可以使用
library(dplyr)
bind_rows(df.lst)
或
如果您想坚持使用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
###获取所有列的名称
coltry库(data.table);rbindlist(df.lst,fill=TRUE)
或bind_行(df.lst)
从dplyr
开始,NA后面的“df”是做什么的?您需要返回更改后的数据。frame
(用NA填充)在函数调用结束时,如果希望lappy
按自己的意愿修改每个data.frame
。它适用于我的假数据集,但不适用于我的真实数据集,我是否需要用dput问一个新问题?
### 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