2017-02-27 3 views
0

Die Funktion stats::model.matrix kann ein Eingangsdatenrahmens in eine Matrix geeignet für rohe algebraische Manipulation zur Umwandlung in der Lösung Regressionsgleichungen etc. Zum Beispiel verwendet werden:Wie produziert man nur den Schnittpunkt mit model.matrix?

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

produziert:

(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 

Einer der Features ist, dass es steuert, wie der Schnittpunkt der Entwurfsmatrix hinzugefügt wird. Vergleichen Sie: model.matrix(~ 0 + ., data = df) vs model.matrix(~ 1 + ., data = df)

nun die . in der Formel gibt an, dass alle Variablen von df sollten einbezogen werden. Dies führt zu einem Problem, wenn ich wünsche einen leeren Datenrahmen passieren und somit nur die Abschnitte erstellen, zB:

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

führt zu:

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

Wer weiß, wie dies zu umgehen, zu Spezifisch möchte ich das folgende Ergebnis von model.matrix(~ 1, data = df), mit Ausnahme der ..

+1

Wie wäre es mit 'if (ncol (df) == 0) model.matrix (~ 1, data = df) sonst model.matrix (~., Data = df)' – Gregor

+0

das ist hilfreich und ist derzeit was ich bin dabei gibt es jedoch direktere Möglichkeiten, ein Objekt ohne die if-Anweisungen an die model.matrix zu übergeben. – Alex

+1

Darf ich fragen, warum würden Sie ein leeres data.frame übergeben ?. Es ist seltsam, eine Formel aus dem Nichts zu machen. Sie können höchstens 1 Spalte data.frame mit 1s haben. Betrachten Sie diese 'model.matrix (~ 1, data = data.frame (rep (1,10)))' – DJJ

Antwort

2

Sie könnten tun:

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

Aber ich denke, Sie besser dran sind mit if-Anweisung. Ich denke, Formeln in R sind mehr Bequemlichkeit als irgendetwas Grundlegendes.

+0

Ich mag Ihre Idee der programmatischen Generierung der Formel aus Text. Können Sie begründen, warum Sie denken, dass es besser ist, eine if-Anweisung zu verwenden? – Alex

+2

Die Absicht der 'if'-Anweisung ist kristallklar. Wenn jemand anderes den Code liest (oder vielleicht sogar Sie in ein paar Jahren) und die 'if' -Anweisung sieht, ist dessen Zweck klar und sie könnten wahrscheinlich erraten, warum' model.matrix (~.) 'Nicht verwendet wird (die 0 -column Eingabe ist ein Sonderfall). Mit dieser Formel würde jemand, der R kennt, sich dieser seltsamen Kante jedoch nicht bewusst ist, wahrscheinlich denken, "diese Formel sollte nur' ~. "Sein und sie vielleicht sogar ändern, indem sie einen Fehler erzeugt. – Gregor

+0

Ich stimme Gregor zu, ich denke, es ist ein bisschen klarer zu verwenden, wenn Aussage. Um eine Zeichenkette zu verwenden und zu konvertieren, sind es im Grunde 4 verschachtelte Funktionsaufrufe. – thc

Verwandte Themen