Объединить / объединить таблицы в R

у меня есть несколько таблиц 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 четыре таблицы с помощью merge(Table1, Table2, Table3, Table4) но я не уверен в предоставлении надлежащих аргументов, и поэтому я получаю ошибка.

ошибка в fix.by (by.x, x):
'by' должен указывать один или несколько столбцов как числа, имена или логические
Вызовы: merge - > объединить.данные.рама -> fix.by

я также попытался написать таблицы на внешний .txt file, а затем прочитайте из этого файла новую таблицу.

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

однако это решение неадекватно по разным причинам, и мне пришлось отказаться от него.

кстати я бы предпочел первое решение как-то работать.

Edit: я забыл упомянуть, что все четыре таблицы имеют одинаковые индексы 1,2,3,.., и те же имена столбцов и т. д. Я указываю на это потому, что например cbind не подходит.

я уверен, что это тривиальная задача, но я застрял. Любой помочь?

4 ответов


Это все еще проблема разных заголовков. Это должно сделать трюк:

names(table2) <- names(table1)
names(table3) <- names(table1)
names(table4) <- names(table1)

сделать это для каждой таблицы, а затем

rbind(table1,table2,...)

Если вы хотите знать, если заголовки одинаковы, вы можете сравнить их

names(table1) == names(table2)

etc.


вы ищете rbind

попробовать

do.call(rbind, list(Table1, Table2, Table3, Table4))

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, если ваши наборы данных большие.


вы можете использовать Reduce с merge:

l <- list(Table1, Table2, Table3, Table4)
Reduce(function(x, y) merge(x, y, all=TRUE), l)

hth