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

Merge two data.frames where one of the data frame contain an extra row

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

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

但这也没有用。

使用merge。请注意,常用列有不同的名称:type 对应 df1term 对应 df2,因此您应该通过 [=17= 将此信息传递给 merge 函数] 和 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