2017-02-27 40 views
0

功能stats::model.matrix可用於一個輸入數據幀轉換成適用於生產代數運算的矩陣求解迴歸方程等。例如:如何僅使用model.matrix生成截距?

set.seed(0) 
df <- data.frame(a = rnorm(5), n = rnorm(5)) 
model.matrix(~., data = df) 

生產:

(Intercept)   a   n 
1   1 1.2629543 -1.539950042 
2   1 -0.3262334 -0.928567035 
3   1 1.3297993 -0.294720447 
4   1 1.2724293 -0.005767173 
5   1 0.4146414 2.404653389 

之一功能是它控制如何將截距添加到設計矩陣中。比較:model.matrix(~ 0 + ., data = df) VS model.matrix(~ 1 + ., data = df)

現在,公式中的.指定的df所有變量應包括在內。這就導致了一個問題,當我想傳遞一個空的數據幀,從而創造公正的攔截,如:

df <- data.frame(matrix(, nrow=5, ncol=0)) 
model.matrix(~ ., data = df) 

導致:

Error in terms.formula(object, data = data) : 
    '.' in formula and no 'data' argument 

有誰知道如何解決這個問題,以具體而言,除了使用.之外,我想產生model.matrix(~ 1, data = df)給出的以下結果。

+1

'if(ncol(df)== 0)model.matrix(〜1,data = df)else model.matrix(〜。,data = df)' – Gregor

+0

這對我有幫助,但是,如果沒有if語句,是否有更直接的方法將某個對象傳遞給model.matrix。 – Alex

+1

請問您爲什麼要傳遞一個空的data.frame ?.從無到有做一個公式是很奇怪的。最多可以有1列data.frame與1s代替。考慮這個'model.matrix(〜1,data = data.frame(rep(1,10)))' – DJJ

回答

2

你可以這樣做:

model.matrix(as.formula(paste0("~", colnames(df), "+1", collapse="+")), data=df) 

不過,我認爲你最好if語句使用。我認爲R中的公式比任何基本的東西都更方便。

+0

我喜歡用編程方式從文本生成公式的想法。你能證明爲什麼你認爲我更好地使用if語句嗎? – Alex

+2

「if」陳述的意圖非常明確。如果其他人閱讀代碼(或者甚至幾年),並看到if語句,它的目的很清楚,他們可能猜測爲什麼不使用model.matrix(〜。)'(0列輸入是一種特殊情況)。有了這個公式,知道R但不知道這個奇怪邊緣的人可能會認爲「這個公式應該只是'〜',甚至可能會改變它,造成一個bug。 – Gregor

+0

我同意Gregor,我認爲使用if語句有點清晰。要使用字符串並進行轉換,它基本上是4個嵌套的函數調用。 – thc