2014-09-03 42 views
4

如何追加两个矩阵而不丢失dimname?在R中追加两个矩阵而不丢失dimname

设置一些数据:

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 

我已经失去了 “治疗” 和行和列维度上的“Loc”名称。

是否有直接的方法来追加两个而不丢失dimname?

在这种情况下,可以假定dimnames是相同的,或者假设我们只是想要第一个对象具有的任何dimnames。浮现在脑海

+2

相关答案一个问题:http://stackoverflow.com/questions/9213468/r-losing-names-of-a-table-after-cbind-or-rbind – thelatemail 2014-09-03 04:14:19

回答

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

+1。 (请参阅R公共聊天室。) – A5C1D2H2I1M1N2O1R2T1 2014-09-03 03:58:37

+0

谢谢,非常好。我尽可能在右侧使用'names(dimnames())'来将名称拉出来,但我没有想到我可能会分配给'names(dimnames())'左边(尽管我知道我可以单独使用'dimnames'来完成)。 – 2014-09-03 04:05:11

+1

@Glen_b - 我不认为这会说实话。尝试一下,看看是我的理念。 – thelatemail 2014-09-03 04:06:03

3

一件事是使用melt从“reshape2”和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 
} 

这从第一矩阵取dimnamesnames,并将其分配到绑定矩阵组的dimnamesnames

xtabs解决方案还具有潜在的缺点,如果有重复你的矩阵dimnames(例如,复制rownames),xtabssum这些值。比较输出,例如,在结果的差异如下:

xtabs(value ~ Treatment + Loc, rbind(melt(m1), melt(m2), melt(m2))) 
myFun(m1, m2, m2) 
+0

感谢您提供'melt' /'xtabs',nice功能,最后的额外讨论,以及你在R公共聊天室中的讨论指针。 – 2014-09-03 04:13:59

+0

@Glen_b,没问题:-) – A5C1D2H2I1M1N2O1R2T1 2014-09-03 04:20:54