2012-11-17 52 views
1

在R,我们可以使用model.matrix()构建设计矩阵,例如,转换model.matrix中的R的一组向量

grp.ids = as.factor(c(rep(1,8), rep(2,4), rep(3,2))) 
x = model.matrix(~grp.ids) 

给出了设计矩阵x

(Intercept) grp.ids2 grp.ids3 
1   1  0  0 
2   1  0  0 
3   1  0  0 
4   1  0  0 
5   1  0  0 
6   1  0  0 
7   1  0  0 
8   1  0  0 
9   1  1  0 
10   1  1  0 
11   1  1  0 
12   1  1  0 
13   1  0  1 
14   1  0  1 
attr(,"assign") 
[1] 0 1 1 
attr(,"contrasts") 
attr(,"contrasts")$grp.ids 
[1] "contr.treatment" 

然而,如果现在我得到如上的设计矩阵x,并希望通过某种方式获得“分组向量”grp.idsx。我怎样才能做到这一点?谢谢!

回答

3

我不相信你可以恢复grp.id,就像它最初创建的一样,因为不可能告诉原始值是什么。尽管如此,您可以创建一个导致相同model.maxtrix的矢量。

factor(apply(x, 1, paste, collapse = "."), labels = seq(ncol(x))) 

但是,在这种特殊情况下,这会非常接近。


为前一个标签给的1阶,3,2(而不是所期望的1,2,3),这是因为我们得到了 “1.0.0”, “1.1.0” ,“1.0.1”作为我们的实际输出,并且按照字母顺序排序,这些给出了命令1,3,2。如果我们反转输入字符串,所以我们有“0.0.1”,“0.1.1”和“1.0.1”,那么这将给所需的顺序,所以下面应该工作

factor(apply(x, 1, function(x){paste(rev(x), collapse = ".")}), labels = seq(ncol(x))) 
+0

谢谢你的解决方案!我认为每个组别使用什么数字并不重要,因为他们只是因素水平:) – alittleboy

+0

顺便说一句,有没有什么办法让水平按升序排列?我目前有1,3,2,但希望获得1,2,3。这样,当我重建model.matrix时,我可以得到相同的结果。谢谢。 – alittleboy

+1

@alittleboy为你添加了一个更新 – Dason