【问题标题】:merge multiple data.frame by row in R在R中逐行合并多个data.frame
【发布时间】:2013-01-24 20:53:18
【问题描述】:

我想在 R 中使用 row.names merge 多个 data.frame,做一个完整的外部连接。为此,我希望做到以下几点:

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

我希望得到的是:

    V1 V2 V3
  a 10 1  3
  b 13 2  4
  c 14 NA 3
  d NA NA 11

【问题讨论】:

    标签: r merge dataframe do.call


    【解决方案1】:

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

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

    确实:

    > res
      V1.x V1.y V1
    a   10    1  3
    b   13    2  4
    c   14   NA  3
    d   NA   NA 11
    

    行连接的结果是在答案中添加了具有原始行名的列,而该列又不包含行名:

    > 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
    

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

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

    Reduce 再次尝试合并时,除非手动清理名称,否则找不到任何匹配项。

    【讨论】:

      【解决方案2】:

      为了连续性,这不是一个干净的解决方案,而是一种解决方法,我使用sapply 转换“Reduce”的列表参数。

      Reduce(function(a,b) merge(a,b,by=0,all=T),
                            sapply(list(x,y,z),rbind))[,-c(1,2)]
         x y.x y.y
      1 10   1   3
      2 13   2   4
      3 14  NA   3
      4 NA  NA  11
      Warning message:
      In merge.data.frame(a, b, by = 0, all = T) :
        column name ‘Row.names’ is duplicated in the result
      

      【讨论】:

        【解决方案3】:

        由于某种原因,我在使用 Reduce 方面没有取得多大成功。给定一个 data.frames 列表(df.lst)和一个后缀列表(suff.lst)来更改相同列的名称,这是我的解决方案(它是循环,我知道它对于 R 标准来说很难看,但它有效) :

        df.merg <- as.data.frame(df.lst[1])
        colnames(df.merg)[-1] <- paste(colnames(df.merg)[-1],suff.lst[[1]],sep="")
        for (i in 2:length(df.lst)) {
            df.i <- as.data.frame(df.lst[i])
            colnames(df.i)[-1] <- paste(colnames(df.i)[-1],suff.lst[[i]],sep="")
            df.merg <- merge(df.merg, df.i, by.x="",by.y="", all=T)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-22
          • 2013-12-04
          • 2017-03-14
          • 1970-01-01
          • 2015-07-11
          • 1970-01-01
          相关资源
          最近更新 更多