在R中附加两个矩阵而不会丢失dimnames

时间:2014-09-03 03:08:22

标签: r matrix append

如何在不丢失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。

2 个答案:

答案 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),则dimnamesrownames那些价值观。比较输出,例如,以下结果的差异:

xtabs