Extraktion von Informationen aus dem bedingten Formel
Frage
Ich mag eine R-Funktion schreiben, die eine Formel als erstes Argument akzeptiert, ähnlich wie lm () oder GLM () und Freunde. In diesem Fall ist es eine Funktion, die einen Datenrahmen und schreibt eine Datei in SVMLight Format nimmt, der hat diese allgemeine Form:
<line> .=. <target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>
<target> .=. +1 | -1 | 0 | <float>
<feature> .=. <integer> | "qid"
<value> .=. <float>
<info> .=. <string>
zum Beispiel der folgenden Datenrahmen:
result qid f1 f2 f3 f4 f5 f6 f7 f8
1 -1 1 0.0000 0.1253 0.0000 0.1017 0.00 0.0000 0.0000 0.9999
2 -1 1 0.0098 0.0000 0.0000 0.0000 0.00 0.0316 0.0000 0.3661
3 1 1 0.0000 0.0000 0.1941 0.0000 0.00 0.0000 0.0509 0.0000
4 -1 2 0.0000 0.2863 0.0948 0.0000 0.34 0.0000 0.7428 0.0608
5 1 2 0.0000 0.0000 0.0000 0.4347 0.00 0.0000 0.9539 0.0000
6 1 2 0.0000 0.7282 0.9087 0.0000 0.00 0.0000 0.0000 0.0355
würde wie folgt dargestellt werden:
-1 qid:1 2:0.1253 4:0.1017 8:0.9999
-1 qid:1 1:0.0098 6:0.0316 8:0.3661
1 qid:1 3:0.1941 7:0.0509
-1 qid:2 2:0.2863 3:0.0948 5:0.3400 7:0.7428 8:0.0608
1 qid:2 4:0.4347 7:0.9539
1 qid:2 2:0.7282 3:0.9087 8:0.0355
Die Funktion Ich mag würde zu schreiben, so etwas wie diese nennen würde:
write.svmlight(result ~ f1+f2+f3+f4+f5+f6+f7+f8 | qid, data=mydata, file="out.txt")
oder auch
write.svmlight(result ~ . | qid, data=mydata, file="out.txt")
Aber ich kann nicht herausfinden, wie model.matrix()
zu verwenden und / oder model.frame()
zu wissen, welche Spalten es sollte schreiben. Sind das die richtigen Dinge zu betrachten?
Jede Hilfe sehr geschätzt!
Lösung
Partielle Antwort. Sie können eine Formel Objekt Index a Parse-Baum der Formel zu erhalten:
> f<-a~b+c|d
> f[[1]]
`~`
> f[[2]]
a
> f[[3]]
b + c | d
> f[[3]][[1]]
`|`
> f[[3]][[2]]
b + c
> f[[3]][[3]]
d
Alles was Sie jetzt brauchen, ist Code, diesen Baum zu gehen.
UPDATE:. Hier ist ein Beispiel für eine Funktion, die den Baum geht
walker<-function(formu){
if (!is(formu,"formula"))
stop("Want formula")
lhs <- formu[[2]]
formu <- formu[[3]]
if (formu[[1]]!='|')
stop("Want conditional part")
condi <- formu[[3]]
flattener <- function(f) {if (length(f)<3) return(f);
c(Recall(f[[2]]),Recall(f[[3]]))}
vars <- flattener(formu[[2]])
list(lhs=lhs,condi=condi,vars=vars)
}
walker(y~a+b|c)
Schauen Sie auch in der Dokumentation zu terms.formula
und terms.object
. Mit Blick auf den Code für einige Funktionen, die bedingte Formeln nehmen können helfen, für zB. die lmer
Funktion in lme4
Paket.
Andere Tipps
I verwendet
formu.names <- all.vars(formu)
Y.name <- formu.names[1]
X.name <- formu.names[2]
block.name <- formu.names[3]
In dem Code, den ich schrieb über einen post-hoc für einen friedman Test zu tun:
http: //www.r-statistics.com/2010/02/post-hoc-analysis-for-friedmans-test-r-code/
Aber es wird nur funktionieren, für: Y`X | Block
Ich hoffe auf eine bessere Antwort andere geben.