Extraire des informations de formule conditionnelle
Question
Je voudrais écrire une fonction R qui accepte une formule comme premier argument, similaire à lm () ou GLM () et les amis. Dans ce cas, il est une fonction qui prend une trame de données et écrit un fichier au format SVMLight , qui a cette forme générale:
<line> .=. <target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>
<target> .=. +1 | -1 | 0 | <float>
<feature> .=. <integer> | "qid"
<value> .=. <float>
<info> .=. <string>
par exemple, la trame de données suivante:
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
serait représentée comme suit:
-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
La fonction que je voudrais écrire serait appelé quelque chose comme ceci:
write.svmlight(result ~ f1+f2+f3+f4+f5+f6+f7+f8 | qid, data=mydata, file="out.txt")
Ou même
write.svmlight(result ~ . | qid, data=mydata, file="out.txt")
Mais je ne peux pas comprendre comment utiliser model.matrix()
et / ou model.frame()
savoir quelles colonnes il est censé écrire. Est-ce les bonnes choses à regarder?
Toute aide appréciée!
La solution
réponse partielle. Vous pouvez indicer un objet de formule pour obtenir un arbre d'analyse syntaxique de la formule:
> 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
Maintenant, tout ce dont vous avez besoin est un code pour marcher cet arbre.
Mise à jour. Voici un exemple d'une fonction qui marche l'arbre
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)
Regardez aussi la documentation terms.formula
et terms.object
. En regardant le code pour certaines fonctions qui prennent des formules conditionnelles peuvent aider, par exemple. la fonction de lmer
dans le set de lme4
.
Autres conseils
je
formu.names <- all.vars(formu)
Y.name <- formu.names[1]
X.name <- formu.names[2]
block.name <- formu.names[3]
Dans le code, j'ai écrit au sujet de faire un post-hoc pour un test friedman:
http: //www.r-statistics.com/2010/02/post-hoc-analysis-for-friedmans-test-r-code/
Mais il ne fonctionne que pour: Y`X | bloc
J'espère que pour d'autres une meilleure réponse donneront.