在R中合并多个data.frame

Ale*_*lex 9 merge r dataframe do.call

我想在R中使用merge多个,进行全外连接.为此,我希望做到以下几点:data.framerow.names

x = as.data.frame(t(data.frame(a=10, b=13, c=14)))
y = as.data.frame(t(data.frame(a=1, b=2)))
z = as.data.frame(t(data.frame(a=3, b=4, c=3, d=11)))
res = Reduce(function(a,b) merge(a,b,by="row.names",all=T), list(x,y,z))

Warning message:
In merge.data.frame(a, b, by = "row.names", all = T) :
  column name ‘Row.names’ is duplicated in the result
> res
  Row.names Row.names V1.x V1.y V1
    1         1         a   10    1 NA
    2         2         b   13    2 NA
    3         3         c   14   NA NA
    4         a      <NA>   NA   NA  3
    5         b      <NA>   NA   NA  4
    6         c      <NA>   NA   NA  3
    7         d      <NA>   NA   NA 11
Run Code Online (Sandbox Code Playgroud)

我希望得到的将是:

    V1 V2 V3
  a 10 1  3
  b 13 2  4
  c 14 NA 3
  d NA NA 11
Run Code Online (Sandbox Code Playgroud)

Ryo*_*ogi 8

以下工作(最后一些列重命名):

res <- Reduce(function(a,b){
        ans <- merge(a,b,by="row.names",all=T)
        row.names(ans) <- ans[,"Row.names"]
        ans[,!names(ans) %in% "Row.names"]
        }, list(x,y,z))
Run Code Online (Sandbox Code Playgroud)

确实:

> res
  V1.x V1.y V1
a   10    1  3
b   13    2  4
c   14   NA  3
d   NA   NA 11
Run Code Online (Sandbox Code Playgroud)

行连接会发生什么情况是在答案中添加了具有原始rownames的列,而该列又不包含行名称:

> merge(x,y,by="row.names",all=T)
  Row.names V1.x V1.y
1         a   10    1
2         b   13    2
3         c   14   NA
Run Code Online (Sandbox Code Playgroud)

此行为记录在?merge(在值下)

如果匹配涉及行名称,则在左侧添加一个名为Row.names的额外字符列,并且在所有情况下,结果都具有"自动"行名称.

Reduce试图再次合并,但没有找到任何匹配,除非该名手动清理.