Как объединить объекты таблицы по именам столбцов? - PullRequest
0 голосов
/ 09 февраля 2019

Мы можем объединить два фрейма данных по именам столбцов с merge().

d1 <- data.frame(a=9, b=7)
d2 <- data.frame(a=6, b=5, c=5)

merge(d1, d2, all=TRUE)
#   a b  c
# 1 6 5  5
# 2 9 7 NA

Но я сталкиваюсь с неожиданными трудностями с объектами таблицы.

t1 <- table(mtcars[1:16, 10])
t2 <- table(mtcars[-(1:16), 10])

Мои попытки провалились, поэтомудалеко:

# fails
merge(t1, t2, all=TRUE)
merge(t(t1), t(t2), all=TRUE)
merge(as.data.frame(t1), as.data.frame(t2), all=TRUE)
rbind(t1, t2)
data.table::rbindlist(t1, t2)
Reduce(function(x, y) 
  merge(x, y, all=TRUE, by=intersect(names(x), names(y))), list(t1, t2))

Этот работает, но он слишком неуклюжий:

tmp <- merge(t(as.data.frame(t1)), t(as.data.frame(t2)), all=TRUE)
names(tmp) <- unlist(tmp[1, ])
tmp <- `rownames<-`(tmp[-1, ], NULL)
tmp[] <- lapply(tmp, as.numeric)
tmp

Ожидаемый результат:

#   3 4  5
# 1 9 7 NA
# 2 6 5  5 

Как в базе R мы можем эффективно объединять объекты таблиц по именам столбцов для получения data.frame?

Примечание: Я, вероятно, спрашиваю дубликат, но так называемый«Табличные» решения на самом деле всегда связаны с проблемой «data.frame».

1 Ответ

0 голосов
/ 09 февраля 2019

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

merge.tables <- function(...) {
  tables = list(...)
  table.names = unique(unlist(sapply(tables, names)))
  merged = sapply(table.names, function(nm) { 
    sapply(tables, function(tbl) tbl[nm])
  })
  row.names(merged) = 1:nrow(merged)
  merged
}
merge.tables(t1, t2)
...