在R中合并具有不同行长度的多个数据框。

4
我是相对新手,正在尝试解决如何合并多个数据框,这些数据框的行数不同,但都有一个共同的列"Year"。 我查看了类似的问题和这个问题: Merge dataframes, different lengths 提供了一个很好的答案。 但是,当我将其应用到自己的数据时,无法使用多个数据框; 我总是收到错误消息。

示例数据:

> 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"))  

目标是生成一个单一的数据框,其中第1列是年份,第2列是站点1,第3列是站点2,依此类推。我目前有大约17个数据框(最多可能有40个),对应于具有可变时间轴/行数的17个站点。
任何帮助都将不胜感激。
我尝试过的代码:
> NewDF <- merge(df1, df2, by="Year", all.x=TRUE, all.y=TRUE)  

这对于两个data.frame很有效,但是当我尝试添加另一个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
1个回答

17

你想将结果与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

感谢您的快速回复!我刚刚尝试了两个选项,并有几个问题。 1)对于选项1,是否有一种简便的方法来运行与17个数据框的合并?它对于3个非常有效,但不确定将其应用于17个的最有效方法。2)我尝试了reduce函数,对我的前3个数据框完美地工作。当我添加第4个时,我收到了错误消息:“Reduce(function(x,y)merge(x,y,by =“Year”,all.x = TRUE,all.y = TRUE),list(Faye006WWmean,Faye006BWWmean,Faye007WWmean,Grin001WWmean))Error in match.names(clabs,names(xi)):名称与以前的名称不匹配 - KKL234
1)这就是第二种方法的作用。 2)你的第四个“data.frame”有些奇怪-尝试将其与任何其他一个合并,看看会发生什么。 - eddi
我刚刚尝试重新排列列表中的数据框,没有任何问题。一定是我第一次输入代码的方式有误。感谢您的帮助! - KKL234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接