合并两个data.frames,其中一个数据框包含一个额外的行

时间:2017-02-21 18:11:24

标签: r dataframe merge rbind cbind

我有两个数据框,其中两个数据框都有一个公共列。其中一个数据框有一个额外的行。

> df1
                 type        x            y
1                   A       10           417
2                   B        2           575
3                   C        3            14
4                   D      944           205
5                   E       44            87
6                   F      355           883
7                   G       73           150

> df2      
   X1 X2 X3 X4 X5 X6 term
1  9 28  3 34  5 39    B
2 43  7 39 41 46 32    C
3 17 30  0 27  0  9    D
4 42 32  1 10 26 49    E
5 21 17 34 28 35 12    F
6 16 10 18 25  2  0    G

我希望在插入包含term A的行的同时将df1中的列x,y附加到df2,同时为其余列引入NA

目标是获得以下内容:

   X1 X2 X3 X4 X5 X6 x   y  term
   NA NA NA NA NA NA 10 417  A
   9 28  3 34  5 39  2  575  B
  43  7 39 41 46 32  3   14  C
  17 30  0 27  0  9 944 205  D
  42 32  1 10 26 49  44  87  E
  21 17 34 28 35 12 355 883  F
  16 10 18 25  2  0  73 150  G

我使用公共列作为term尝试了合并功能但是没有用,然后我找到了解决方案

cbindPad <- function(...){
  args <- list(...)
  n <- sapply(args,nrow)
  mx <- max(n)
  pad <- function(x, mx){
    if (nrow(x) < mx){
      nms <- colnames(x)
      padTemp <- matrix(NA, mx - nrow(x), ncol(x))
      colnames(padTemp) <- nms
      if (ncol(x)==0) {
        return(padTemp)
      } else {
        return(rbind(x,padTemp))
      }
    }
    else{
      return(x)
    }
  }
  rs <- lapply(args,pad,mx)
  return(do.call(cbind,rs))
}

但这也不起作用。

1 个答案:

答案 0 :(得分:1)

使用merge。请注意,常见列具有不同的名称:typedf1termdf2,因此您应通过merge将此信息传递给by.x函数}和by.y参数。同时设置all=TRUE

> merge(df1, df2, by.x="type", by.y="term", all=TRUE)
  type   x   y X1 X2 X3 X4 X5 X6
1    A  10 417 NA NA NA NA NA NA
2    B   2 575  9 28  3 34  5 39
3    C   3  14 43  7 39 41 46 32
4    D 944 205 17 30  0 27  0  9
5    E  44  87 42 32  1 10 26 49
6    F 355 883 21 17 34 28 35 12
7    G  73 150 16 10 18 25  2  0