Объединение наборов данных, из которых совпадают только некоторые столбцы - PullRequest
1 голос
/ 10 апреля 2019

Я хочу объединить около 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 ]

2 голосов
/ 10 апреля 2019

Вы можете использовать rbindlist, т.е.

library(data.table)
rbindlist(list(df1, df2), fill = TRUE)
1 голос
/ 10 апреля 2019

Вы также можете использовать функцию bind_rows из dplyr package-

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