【问题标题】:How to merge table objects by column names?如何按列名合并表对象?
【发布时间】:2019-02-09 13:24:19
【问题描述】:

我们可以通过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”问题相关联。

【问题讨论】:

  • 您是否有特定原因要使用表格而不是 data.frames?
  • @Ben373 我不确定我是否理解你的问题。
  • 函数table用于制作列联表,不返回data.frame类对象。函数merge 只合并data.frame 类对象。

标签: r merge rbind


【解决方案1】:

使用每个提供的表的唯一名称,我们可以使用这些名称从表中对每个名称进行子集化。此函数应该扩展为使用任意数量的表,但我仅使用您的示例数据对其进行了测试

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)

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 2018-04-21
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2014-06-23
    相关资源
    最近更新 更多