如何在不丢失dimnames的情况下附加两个矩阵?
设置一些数据:
m1 <- structure(c(35.3, 31.7, 25.9, 15.8),
.Dim = c(2L, 2L),
.Dimnames = structure(list(
Treatment = c("no1", "yes1"), Loc = c("North", "South")),
.Names = c("Treatment", "Loc")))
m2 <- structure(c(9.5, 9.6, 7.4, 4.0),
.Dim = c(2L, 2L),
.Dimnames = structure(list(
Treatment = c("no2", "yes2"), Loc = c("North", "South")),
.Names = c("Treatment", "Loc")))
给出了:
> m1
Loc
Treatment North South
no1 35.3 25.9
yes1 31.7 15.8
> m2
Loc
Treatment North South
no2 9.5 7.4
yes2 9.6 4.0
但如果我用rbind
追加他们:
> rbind(m1,m2)
North South
no1 35.3 25.9
yes1 31.7 15.8
no2 9.5 7.4
yes2 9.6 4.0
我已经失去了&#34;治疗&#34;和&#34; Loc&#34;行和列维度上的名称。
有没有一种简单的方法可以在不丢失dimnames的情况下追加这两个?
在这种情况下可以假设dimnames是相同的,或者假设我们只是想要第一个对象具有的任何dimnames。
答案 0 :(得分:4)
以这种方式:
out <- rbind(m1,m2)
names(dimnames(out)) <- names(dimnames(m1))
# Loc
#Treatment North South
# no1 35.3 25.9
# yes1 31.7 15.8
# no2 9.5 7.4
# yes2 9.6 4.0
答案 1 :(得分:3)
我想到的一件事是使用“reshape2”和melt
中的xtabs
:
library(reshape2)
xtabs(value ~ Treatment + Loc, rbind(melt(m1), melt(m2)))
# Loc
# Treatment North South
# no1 35.3 25.9
# yes1 31.7 15.8
# no2 9.5 7.4
# yes2 9.6 4.0
但更有效的解决方案可能是编写一个使用rbind
的函数,使用dimnames
来获得所需的结果。这样的功能可能如下:
myFun <- function(...) {
Lst <- list(...)
Bound <- do.call(rbind, Lst)
names(dimnames(Bound)) <- names(dimnames(Lst[[1]]))
Bound
}
这会从第一个矩阵中获取names
的{{1}},并将其分配给绑定矩阵集的dimnames
{。}}。
names
解决方案还有一个潜在的缺点,即如果您的矩阵中存在重复的dimnames
(例如,重复xtabs
),则dimnames
会rownames
那些价值观。比较输出,例如,以下结果的差异:
xtabs