在R中,我们可以使用model.matrix()
来构造设计矩阵,例如,
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.ids
来获得“分组向量”x
。我怎样才能做到这一点?谢谢!
答案 0 :(得分:3)
我不相信你可以完全像最初创建的那样恢复grp.id,因为它无法分辨出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)))