2016-09-08 9 views
0

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

Первый ДФ:

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/

Благодаря

ответ

1

Поскольку вы пытаетесь соответствовать столбцам, это операция соединения, 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 
+0

Спасибо большого, это устраняет проблему , –

+0

Здравствуйте, я думаю, что вышеупомянутое решение не работает, как я этого хотел. Он в основном вводит дубликаты в столбце Common (A, A, B, B, C, C, D, D, E, F). Могу ли я заставить его дать мне (A, B, C, D, E, F). Таким образом, большинство столбцов должно быть уникальным. –

+0

'merge' создает дублированные ключи, если у вас есть дублированные ключи в исходных данных. Вы можете сначала проверить это. – Psidom

0

безвкусное решение:

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