R中的连接/合并表

Posted

技术标签:

【中文标题】R中的连接/合并表【英文标题】:Concatenate/merge tables in R 【发布时间】:2014-05-29 13:15:48 【问题描述】:

我有一些桌子Table1,Table2,Table3,Table4。他们有相同数量的columnsrows,我想要的是将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 -&gt; &lt;Anonymous&gt; -&gt; rbind -&gt; 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中的连接/合并表的主要内容,如果未能解决你的问题,请参考以下文章

R中的连接/合并表

将 R 中的数据帧连接/合并为向量类型单元格

用于在 R 中合并文件的 ODBC 连接错误

将多行合并为一列,同时用原始表中的“名称”字段替换键

如何从三个表中插入和连接?

怎样一个表中的2个查询结果合并到一个表中的两列