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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top