2012-12-31 80 views
45

Possible Duplicate:
Merge multiple data frames in a list simultaneously合併了很多data.frames

例如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> 

注:id是每個data.frame獨特。我想所得基質的樣子

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 

在這種情況下,我只顯示3個數據集,我確實有它們中的至少22,從而在端欲nx的矩陣(22 + 1),其中n是所有22個數據集的ID號碼。

鑑於2集,我需要得到他們的第一列第二和第三列ids都充滿了價值,如果沒有價值存在,那麼輸入NA代替。

+0

這不是一個解決方案,但除了什麼是@聲明Matthew Plourde。你可以建立data.frames列表:df_list < - lapply(paste0(「df」,1:22),as.name)。 –

+1

儘管此線程可能與另一個線程相同,但問題和答案都以更易讀的方式呈現。 – biocyberman

回答

107

把它們放入一個list和使用mergeReduce

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 

您也可以使用這種更簡潔的版本:

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

+1減少。對於這個簡單的例子,這相當於merge(merge(df1,df2,by ='id',all = T),df3,by ='id',all = T)'。顯然,可以使用循環遍歷數據幀 - 但這正是「Reduce」所做的。 –

+3

我很感謝'Reduce'是用語言編寫的,但我真的希望它更像'* apply'函數,讓您可以爲函數提供額外的參數。我討厭我必須嵌入一個函數定義,只是爲了在'all = TRUE'中使用'merge'。 –

+2

(舊的)重塑包中的merge_recurse和merge_all是一個體面的指南,介紹如何構建一些以更方便的形式爲您完成此操作的內容。 – joran