R中的连接/合并表
Posted
技术标签:
【中文标题】R中的连接/合并表【英文标题】:Concatenate/merge tables in R 【发布时间】:2014-05-29 13:15:48 【问题描述】:我有一些桌子Table1
,Table2
,Table3
,Table4
。他们有相同数量的columns
和rows
,我想要的是将merge
合并成一个大Table
。
我已尝试制作表格列表,然后将其转换为 matrix
,但输出似乎不是我想要的。
l <- list(Table1, Table2, Table3, Table4)
l <- lapply(l, as.data.frame)
m <- matrix(unlist(l), nrow = length(l))
我也尝试使用merge(Table1, Table2, Table3, Table4)
仅merge
四个表,但我不确定是否提供正确的参数,因此出现错误。
fix.by(by.x, x) 中的错误: 'by' 必须将一列或多列指定为数字、名称或逻辑 调用:合并 -> merge.data.frame -> fix.by
我还尝试将表写入外部.txt
文件,然后从该文件中读取一个新表。
#write.table(Table1, file = "file.txt", append = TRUE)
#write.table(Table2, file = "file.txt", append = TRUE, col.names=FALSE)
#write.table(Table3, file = "file.txt", append = TRUE, col.names=FALSE)
#write.table(Table4, file = "file.txt", append = TRUE, col.names=FALSE)
但是由于各种原因,这个解决方案是不够的,我不得不放弃它。
顺便说一句,我希望第一个解决方案能以某种方式工作。
编辑: 我忘了提到所有四个表都有相同的索引1,2,3,..,
和相同的列名等。我指出这一点是因为例如@987654336 @ 不太合适。
我很确定这是一项微不足道的任务,但我被困住了。有什么帮助吗?
【问题讨论】:
您希望您的最终输出如何?如果所有表的列数相同,您是要水平(按行)还是垂直附加数据? @RHelp 将它们垂直附加,以便我可以重新索引表 【参考方案1】:您可以将 Reduce 与合并一起使用:
l <- list(Table1, Table2, Table3, Table4)
Reduce(function(x, y) merge(x, y, all=TRUE), l)
第
【讨论】:
我可能做错了,但reduce
返回了一个包含每个表的名称列的列表,这很奇怪
我修改了适用于以下示例的答案:table1
【参考方案2】:
您正在寻找rbind
试试
do.call(rbind, list(Table1, Table2, Table3, Table4))
【讨论】:
我实际上正在尝试cbind
,但我并没有完全按照我的意愿行事。我会更新问题
Error in match.names(clabs, names(xi)) : names do not match previous names Calls: do.call -> <Anonymous> -> rbind -> match.names Execution halted
这是我从rbind
得到的
检查您的列名是否在所有表中都匹配。列名(表 1)、列名(表 2)等。 R 区分大小写。【参考方案3】:
如果所有表中的所有列都相同,则 rbind 应该可以工作。按照钦梅的回答。 cbind 用于连接列上的数据。否则使用 sqldf。
library(sqldf)
m <- sqldf("select * from table1 union all select * from table2 union all
select * from table3 union all select * from table4")
如果您想要所有观察结果,请使用 union all。如果要删除重复项,请使用 union。 但如果您的数据集很大,这可能比 rbind 慢。
【讨论】:
在列中连接数据是我真正想要的。这就是为什么我在你的问题中回答append vertically
。好的,我也查了
垂直追加意味着在现有数据中添加更多的观察行,对吗?
是的。哦,现在我开始明白了.. 但是rbind
生成一个错误,这可能意味着我还有其他问题..
它在@ChinmayPatil 给我的答案的评论部分中【参考方案4】:
仍然是不同标题的问题。这应该可以解决问题:
names(table2) <- names(table1)
names(table3) <- names(table1)
names(table4) <- names(table1)
对每张桌子都这样做,然后
rbind(table1,table2,...)
如果你想知道标题是否相同,你可以比较它们
names(table1) == names(table2)
等等
【讨论】:
以上是关于R中的连接/合并表的主要内容,如果未能解决你的问题,请参考以下文章