2016-02-26 43 views
0

我有一個數據框,我想用它來生成設計矩陣。model.matrix刪除列

>ct<-read.delim(filename, skip=0, as.is=TRUE, sep="\t", row.names = 1) 
> ct 
     s2 s6 S10 S14 S3 S7 S11 S15 S4 S8 S12 S16 
group 1 1 1 1 2 2 2 2 3 3 3 3 
donor 1 2 3 4 1 2 3 4 1 2 3 4 
>factotum<-apply(ct,1,as.factor) # to turn rows into factors. 
>design <- model.matrix(~0 + factotum[,1] + factotum[,2]) 

最終,我將生成一個字符串並使用as.formula()而不是對公式進行硬編碼。無論如何,這工作併產生一個設計矩陣。儘管如此,它留下了一列。

>design 
    factotum[, 1]1 factotum[, 1]2 factotum[, 1]3 factotum[, 2]2 factotum[, 2]3 factotum[, 2]4 
1    1    0    0    0    0    0 
2    1    0    0    1    0    0 
3    1    0    0    0    1    0 
4    1    0    0    0    0    1 
5    0    1    0    0    0    0 
6    0    1    0    1    0    0 
7    0    1    0    0    1    0 
8    0    1    0    0    0    1 
9    0    0    1    0    0    0 
10    0    0    1    1    0    0 
11    0    0    1    0    1    0 
12    0    0    1    0    0    1 

通過我的推理,列名稱應該是: factotum的[1] 1個factotum的[1] 2 factotum的[1] 3,factotum的[2] 1,factotum的[2] 2 factotum [,2] 3 factotum [,2] 4。這些將被重新命名爲group1,group2,group3,donor1,donor2,donor3,donor4。

這意味着factotum [,2] 1或donor1缺失。我在做什麼,這會失蹤?任何幫助將不勝感激。

乾杯 本。

回答

1

這裏有幾件事。

(1)apply(ct,1,as.factor)不一定會將行變爲因子。嘗試str(factotum),你會看到它失敗。我不知道最快的方法是什麼,但是這應該工作:

factotum <- data.frame(lapply(data.frame(t(ct)), as.factor)) 

(2)由於您使用的因素的工作,model.matrix創建虛擬編碼。在這種情況下,donor有四個值。如果您是2,那麼在factotum[,2]2的列中將得到1。如果您是34,您會在其各自的列中獲得1。那麼,如果你是一個1?那麼,這僅僅意味着你在所有三列中都是0。這樣,您只需要三列來創建四個組。 donor的值1在這裏被稱爲參考組,這是與其他組進行比較的組。

(3)所以現在的問題是...爲什麼group(或factotum[,1])只有兩列?我們可以用兩列輕鬆編碼三個級別,對吧?嗯......是的,這正是當你使用會發生什麼:

design <- model.matrix(~ factotum[,1] + factotum[,2]) 

不過,既然你指定,沒有攔截,你會得到一個額外的列group

(4)通常你不必自己創建設計矩陣。我不確定接下來要使用哪種功能,但在大多數情況下,這些功能會爲您處理。