2012-11-17 53 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