如何按列名合并 table 个对象?
How to merge table objects by column names?
我们可以通过 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
但是我在处理 table 个对象时遇到了意想不到的困难。
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
我们如何在 base R 中有效地按列名合并 table 个对象以获得 data.frame?
注意: 我可能会问一个重复的问题,但所谓的 "table" 解决方案实际上总是与 "data.frame" 问题相关联。
使用每个提供的表的唯一名称,我们可以使用它们从表中提取每个名称的子集。此函数 应该 扩展以使用任意数量的表,但我只使用您的示例数据对其进行了测试
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)
我们可以通过 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
但是我在处理 table 个对象时遇到了意想不到的困难。
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
我们如何在 base R 中有效地按列名合并 table 个对象以获得 data.frame?
注意: 我可能会问一个重复的问题,但所谓的 "table" 解决方案实际上总是与 "data.frame" 问题相关联。
使用每个提供的表的唯一名称,我们可以使用它们从表中提取每个名称的子集。此函数 应该 扩展以使用任意数量的表,但我只使用您的示例数据对其进行了测试
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)