2012-12-31 19 views
45

Possible Duplicate:
Merge multiple data frames in a list simultaneouslyScalanie dużo data.frames

przykład data.frames:

df1 = data.frame(id=c('1','73','2','10','43'),v1=c(1,2,3,4,5)) <br> 
df2 = data.frame(id=c('7','23','57','2','62','96'),v2=c(1,2,3,4,5,6)) <br> 
df3 = data.frame(id=c('23','62'),v3=c(1,2)) <br> 

Uwaga: id jest unikalny dla każdego data.frame. I chce otrzymana osnowa wyglądać

1  1 NA NA 
2  3 4 NA 
7  NA 1 NA 
10  4 NA NA 
23  NA 2 1 
43  5 NA NA 
57  NA 3 NA 
62  NA 5 2 
73  2 NA NA 
96  NA 6 NA 

W tym przypadku, wykazują tylko 3 zestawy danych, faktycznie wykazują co najmniej 22 z nich, aby w końcu chce matrycy nx (22 + 1), gdzie n to liczba identyfikatorów dla wszystkich 22 zestawów danych.

Biorąc 2 zestawy danych, muszę uzyskać ich ids w pierwszej kolumnie i kolumnach 2 i 3 są wypełnione wartościami, jeśli nie ma wartości istnieje, to wejście NA zamiast.

+0

To nie jest rozwiązanie, ale oprócz tego, co jest powiedziane przez @ Matthew Plourde. Możesz zbudować listę data.frames: df_list <- lapply (paste0 ("df", 1: 22), as.name). –

+1

Mimo że ten wątek może być duplikatem innego, ale zarówno pytania, jak i odpowiedzi są prezentowane w bardziej czytelny sposób. – biocyberman

Odpowiedz

107

umieścić je w list i używać merge z Reduce

Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3)) 
# id v1 v2 v3 
# 1 1 1 NA NA 
# 2 10 4 NA NA 
# 3 2 3 4 NA 
# 4 43 5 NA NA 
# 5 73 2 NA NA 
# 6 23 NA 2 1 
# 7 57 NA 3 NA 
# 8 62 NA 5 2 
# 9 7 NA 1 NA 
# 10 96 NA 6 NA 

Można również skorzystać z tej bardziej zwięzłą wersję:

Reduce(function(...) merge(..., all=TRUE), list(df1, df2, df3)) 
+4

+1 dla "Ogranicz". Dla tego prostego przykładu jest to równoznaczne z 'merge (scalanie (df1, df2, by = 'id', all = T), df3, by = 'id', all = T)'. Oczywiście można użyć pętli, iterując przez ramki danych - ale właśnie to robi 'Reduce'. –

+3

Jestem wdzięczny, że 'Reduce' jest w języku, ale naprawdę chciałbym, aby było bardziej jak funkcje' * apply', pozwalając ci podać dodatkowe argumenty za dostarczoną funkcjonalność. Nienawidzę, że muszę osadzić definicję funkcji tylko po to, aby użyć 'merge' z' all = TRUE'. –

+2

'merge_recurse' i' merge_all' z (starszego) pakietu przekształcenia są przyzwoitym przewodnikiem, jak zbudować coś, co zrobi to dla ciebie w wygodniejszej formie. – joran