合并仅某些列匹配的数据集

时间:2019-04-10 13:13:20

标签: r merge data.table

我想合并大约27个不同的数据集。对于每个这些数据集,都有许多相同的列,但也有许多不相同的列。我希望将相同的列“堆栈”起来,而只需添加不相同的列即可。

让我们假设数据集1和2如下所示:

library(data.table)
df1 <- fread(
    "A   B   C  iso   year   
     0   1   1  NLD   2009   
     1   0   2  NLD   2009   
     0   0   3  AUS   2011   
     1   0   4  AUS   2011   
     0   1   7  NLD   2008   
     1   0   1  NLD   2008   
     0   0   3  AUS   2012",
  header = TRUE
)
df2 <- fread(
    "A   B   D  E  iso   year   
     0   1   1  NA ECU   2009   
     1   0   2  0  ECU   2009   
     0   0   3  0  BRA   2011   
     1   0   4  0  BRA   2011   
     0   1   7  NA ECU   2008   
     1   0   1  0  ECU   2008   
     0   0   3  2  BRA   2012   
     1   0   4  NA BRA   2012",
  header = TRUE
)

我现在想将这些df与:

rbind(df1, df2, fill=TRUE)

合并的数据集应如下所示:

df_merged <- fread(
    "A   B   C  D   E   iso   year   
     0   1   1  NA  NA  NLD   2009   
     1   0   2  NA  NA  NLD   2009   
     0   0   3  NA  NA  AUS   2011   
     1   0   4  NA  NA  AUS   2011   
     0   1   7  NA  NA  NLD   2008   
     1   0   1  NA  NA  NLD   2008   
     0   0   3  NA  NA  AUS   2012   
     0   1   NA  1  NA  ECU   2009   
     1   0   NA  2  0   ECU   2009   
     0   0   NA  3  0   BRA   2011   
     1   0   NA  4  0   BRA   2011   
     0   1   NA  7  NA  ECU   2008   
     1   0   NA  1  0   ECU   2008   
     0   0   NA  3  2   BRA   2012   
     1   0   NA  4  NA  BRA   2012",",
   header = TRUE
)

但是由于某些原因,将其应用于实际数据时出现错误:

    Error in rbind(deparse.level, ...) : 
      numbers of columns of arguments do not match

我试图在示例中重新创建错误(通过使df的列和行的数量不同),但未能做到。

有什么想法吗?

编辑:显然,问题是我的两个数据集中的类在某些情况下列名不同。我将在工作后发布更新。

2 个答案:

答案 0 :(得分:2)

您可以使用rbindlist,即

library(data.table)
rbindlist(list(df1, df2), fill = TRUE)

答案 1 :(得分:1)

您还可以使用bind_rows软件包中的dplyr功能-

> bind_rows(df1,df2)

    A B  C iso year  D  E
 1: 0 1  1 NLD 2009 NA NA
 2: 1 0  2 NLD 2009 NA NA
 3: 0 0  3 AUS 2011 NA NA
 4: 1 0  4 AUS 2011 NA NA
 5: 0 1  7 NLD 2008 NA NA
 6: 1 0  1 NLD 2008 NA NA
 7: 0 0  3 AUS 2012 NA NA
 8: 0 1 NA ECU 2009  1 NA
 9: 1 0 NA ECU 2009  2  0
10: 0 0 NA BRA 2011  3  0
11: 1 0 NA BRA 2011  4  0
12: 0 1 NA ECU 2008  7 NA
13: 1 0 NA ECU 2008  1  0
14: 0 0 NA BRA 2012  3  2
15: 1 0 NA BRA 2012  4 NA