Объединить / объединить таблицы в 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 должен работать, если все ваши столбцы одинаковы во всех таблицах. Следуйте ответа Чинмай по. 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