Объединение нескольких фреймов данных в R

У меня проблема с несколькими фреймами данных, требующими слияния. Я пробовал rbind, cbind и базовое слияние. Но это не дает мне удовлетворительных результатов. Моя проблема ниже:

Первая ДФ:

Common, Col 2, Col 3
A, 2, 3
B, 3, 4
C, 4, 5
D, 5, 6

Второй ДФ:

Common, Col 3, Col 4
B, 4, 5
D, 6, 6
E, 3, 4

Третий ДФ:

Common, Col 1, Col 2
A, a, 2
C, f, 4
F, g, 1

Когда я комбинирую это, я хочу:

Common, Col 1, Col 2, Col 3, Col 4
A, a, 2, NA, NA
B, NA, 3, 4, 5
C, f, 4, 5, NA
D, NA, 5, 6, 6
E, NA, NA, 3, 4
F, g, 1, NA, NA

Мой текущий код для объединения нескольких df вместе использует:

df_list <- mget(ls(pattern="*df"))
New_df <- do.call(rbind.fill, df_list)

Метод rbind.fill не работает. Он в основном не сворачивает строки по мере необходимости.

Я попробовал multmerge() по ссылке ниже. Но не могу заставить его работать. https://www.r-bloggers.com/merging-multiple-data-files-into-one-data-frame/

Спасибо


person AV111    schedule 08.09.2016    source источник


Ответы (2)


Поскольку вы пытаетесь сопоставить столбцы, это операция соединения, rbind этого не сделает, вам нужно merge; И merge по умолчанию устанавливает by = intersect(names(x), names(y)), т.е. общие столбцы, поэтому вы можете просто использовать функцию Reduce() для объединения фреймов данных один за другим, предполагая, что они уже собраны в список:

Reduce(function(x,y) merge(x, y, all=T), df_list)

#  Common Col.2 Col.3 Col.4 Col.1
#1      A     2     3  <NA>     a
#2      B     3     4     5  <NA>
#3      C     4     5  <NA>     f
#4      D     5     6     6  <NA>
#5      E  <NA>     3     4  <NA>
#6      F     1  <NA>  <NA>     g
person Psidom    schedule 08.09.2016
comment
Большое спасибо, это решает проблему. - person AV111; 08.09.2016
comment
Здравствуйте, я думаю, что приведенное выше решение не работает так, как я хотел. В основном он вводит дубликаты в общий столбец (A, A, B, B, C, C, D, D, E, F). Могу ли я заставить его дать мне (A,B,C,D,E,F). Таким образом, самый левый столбец должен быть уникальным. - person AV111; 08.09.2016
comment
merge создает дубликаты ключей, если у вас есть дубликаты ключей в ваших исходных данных. Вы можете проверить это в первую очередь. - person Psidom; 08.09.2016
comment
Вы правы @Psidom, теперь у меня есть разные наборы данных с идентичным первым столбцом, но другие столбцы могут быть или не быть идентичными. Как мне объединить их, чтобы создать основной набор данных, который уникален по первому столбцу, но включает в себя и все остальное. Для любого заданного индекса в первом столбце другие столбцы, присутствующие в разных наборах данных, идентичны дополнительным столбцам, которые необходимо добавить. - person AV111; 08.09.2016
comment
Не совсем уверен, что вы после. Если вы хотите, чтобы первый столбец был уникальным, либо используйте unique() для всех фреймов данных, чтобы увидеть, есть ли все еще повторяющиеся значения, или, если это не работает, это означает, что вам нужно применить какой-либо метод агрегирования к вашему набору данных, сгруппированному по ключевой столбец. - person Psidom; 08.09.2016
comment
К сожалению, у меня есть дубликаты только с дополнительным (не дублирующимся столбцом), и мне приходится объединять все вместе (некоторая форма перезаписи необходима для повторяющихся столбцов. Что вы думаете об этом подходе: Trimmed_DF ‹-aggregate(Combined_DF[-1], by =list(Combined_DF$Column1), SomeFunc) Combined_DF — это комбинированный DF с дублированными значениями столбца 1. Я хочу свернуть (не исключить) эти строки. Кроме того, SomeFunc — это проблема, я не думаю, что мне нужна там функция, думаю, мне нужно что-то еще там. - person AV111; 09.09.2016

Неэлегантное решение:

A = data.frame(c1 = c(1, 2), c3 = c('yes', 'no'))
B = data.frame(c2 = c(1, 2), c4 = c('Tokyo', 'Berlin'))

A1 = cbind(A, c2 = rep(NA, 2), c4 = rep(NA, 2))
B1 = cbind(B, c1 = rep(NA, 2), c3 = rep(NA, 2))

rbind(A1, B1)

Что производит

  c1   c3 c2     c4
1  1  yes NA   <NA>
2  2   no NA   <NA>
3 NA <NA>  1  Tokyo
4 NA <NA>  2 Berlin
person NickR    schedule 08.09.2016