2014-02-25 600 views
1

我對R相對較新,並試圖找出如何合併多個data.frames與不同數量的行,但都與一個共同的列,「年」。我已經看過類似的問題,並且這個問題: Merge dataframes, different lengths 提供了一個很好的答案。但是,當我將它應用於我自己的數據時,我無法使用它處理多個data.frames;我總是收到一條錯誤消息。在R中合併多個data.frames與不同的行長

的樣本數據:

> df1 <- data.frame(Year=2006:2011, Site1=c("2.3", "1" , "3.1", "2.9", "1.4", "3")) 
> df2 <- data.frame(Year=2007:2011, Site2=c("2.7", "4.1", "1.1", "2.6", "3.1")) 
> df3 <- data.frame(Year=2008:2011, Site3=c("1.3", "2" , "3.6", "1.7")) 

的目標是產生一個data.frame其中列1年,第2列是站點1,第3列是站點2,依此類推。我目前有17個data.frames(最多有40個),對應於17個可變時間線/行數的站點。

任何幫助,將不勝感激。

代碼我已經試過:

> NewDF <- merge(df1, df2, by="Year", all.x=TRUE, all.y=TRUE) 

這2個data.frames偉大的工作,但是當我試圖在另一個data.frame添加,我收到錯誤消息:

> NewDF <- merge(list=c(df1, df2, df3), by="Year", all.x=TRUE, all.y=TRUE) 
Error in as.data.frame(x) : argument "x" is missing, with no default 

回答

8

你想要的結果與df3合併,即:

merge(df3, merge(df1, df2, by="Year", all.x=TRUE, all.y=TRUE), by = "Year", all.x = TRUE, all.y = TRUE) 
# Year Site3 Site1 Site2 
#1 2006 <NA> 2.3 <NA> 
#2 2007 <NA>  1 2.7 
#3 2008 1.3 3.1 4.1 
#4 2009  2 2.9 1.1 
#5 2010 3.6 1.4 2.6 
#6 2011 1.7  3 3.1 

或者,如果你有你的data.frame的列表中,使用Reduce推廣以上內容:

Reduce(function(x,y) merge(x, y, by = "Year", all.x = TRUE, all.y = TRUE), 
     list(df1, df2, df3)) 
# Year Site1 Site2 Site3 
#1 2006 2.3 <NA> <NA> 
#2 2007  1 2.7 <NA> 
#3 2008 3.1 4.1 1.3 
#4 2009 2.9 1.1  2 
#5 2010 1.4 2.6 3.6 
#6 2011  3 3.1 1.7 
+0

感謝您的快速響應!我剛剛嘗試了兩種選擇,並有幾個問題。 1)對於選項1,是否有一種方法可以輕鬆運行17個data.frames的合併?它適用於3,但不確定將其應用於17的最有效方式。2)我嘗試了reduce函數,它對我的​​前3個數據幀非常合適。當我添加第四個時,我收到一條錯誤消息:'Reduce(function(x,y)merge(x,y,by =「Year」,all.x = TRUE,all.y = TRUE),list(Faye006WWmean, Faye006BWWmean,Faye007WWmean,Grin001WWmean)) Match.names(clabs,names(xi))中的錯誤:名稱與以前的名稱不匹配 – KKL234

+0

@ user2296922 1)這就是第二種方法的作用2)第4個data.frame有些奇怪' - 嘗試將其中一個與其他任何一個合併,看看會發生什麼 – eddi

+0

我只是嘗試重新排列列表中的data.frames,並且沒有問題。一定是我第一次輸入代碼的方式。謝謝您的幫助! – KKL234