ddply dans une fonction

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Bigot Anthony
Messages : 108
Enregistré le : 07 Avr 2009, 09:07

ddply dans une fonction

Messagepar Bigot Anthony » 24 Juil 2013, 15:55

Bonjour,

j'essaie de faire appel à ddply dans une fonction.

La fonction utilisée dans ddply est là pour calculer la valeur du 3è quartile (ou 75è centile pour le coup).

Code : Tout sélectionner

f<-function(df, colGrp="group", colVal="values", s=0.75){
require(plyr)

print(colVal)

res<-ddply(df, .(colGrp), transform, seuil=quantile(colVal, eval(s)))

return(res)
}
f(dat)


Pour colGrp, pas de soucis l'évaluation se fait bien.
Pour s, obligé de passer par eval(s).
Pour colVal par contre je ne comprend pas, j'ai essayé avec eval et get mais j'ai toujours la même erreur ; pourtant le print se fait bien.

"colVal" seul :

Code : Tout sélectionner

Erreur dans eval(expr, envir, enclos) : objet 'colVal' introuvable


eval(colVal) ou get(colVal)

Code : Tout sélectionner

Erreur dans eval(colVal) : objet 'colVal' introuvable
Erreur dans get(colVal) : objet 'colVal' introuvable



Si je comprend bien, ddply ne trouve pas colVal dans l'environnement (d'ailleurs si je crée un variable colVal qui prend pour valeur le nom de la colonne "values", tout fonctionne).

Je ne vois vraiment pas comment faire.
La règle des 3G vous connaissez? R est:
GRATUIT GIGANTESQUE et GENIAL

Bigot Anthony
Messages : 108
Enregistré le : 07 Avr 2009, 09:07

Messagepar Bigot Anthony » 25 Juil 2013, 13:05

Un jeu pour tester (avec mtcars):


Code : Tout sélectionner

# selection de la cylindrée et du poids
dat1=dt=mtcars[, c("cyl","wt")]

# fonction pour calculé le centile voulu du poids en fonction de la cylindée
f<-function(df, colGrp="group", colVal="values", s=0.75){
require(plyr)
print(colVal)
res<-ddply(df, .(colGrp), transform, seuil=quantile(colVal, eval(s)))
return(res)
}

# appel de la fonction
f(dat1, colGrp="cyl", colVal="wt")

# resultats
# [1] "wt"
# Erreur dans quantile(colVal, eval(s)) : objet 'colVal' introuvable
 


si on le fait directement avec ddply ; sans les guillemets ça fonctionne ; avec les guillemets, il faut

Code : Tout sélectionner

ddply(df, c("cyl")...)
au lieu de

Code : Tout sélectionner

ddply(df, .("cyl")...)


et pour "wt" pas moyen de faire fonctionner...
La règle des 3G vous connaissez? R est:

GRATUIT GIGANTESQUE et GENIAL

Didier Plat
Messages : 225
Enregistré le : 02 Nov 2009, 16:47
Contact :

Messagepar Didier Plat » 25 Juil 2013, 15:17

Bonjour,
Une suggestion :

Code : Tout sélectionner

dat1=dt=mtcars[, c("cyl","wt")]
require(plyr)

# fonction pour calculer le centile voulu du poids en fonction de la cylindée
f<-function(df, colGrp="group", colVal="values", s=0.75){
res<-ddply(df, colGrp, .fun=function(x) quantile(x[,colVal], probs=s))
return(res)
}

# appel de la fonction
f(dat1, colGrp="cyl", colVal="wt")



dicko ahmadou
Messages : 444
Enregistré le : 21 Nov 2009, 20:15

Messagepar dicko ahmadou » 28 Juil 2013, 06:48

La fonction here du package plyr a été écrite dans ce but précis (capturer l'environnement), faudra juste rajouter un appel à get (ou eval(parse(text = ...))

Code : Tout sélectionner

f <- function(df, colGrp = "group", colVal = "values", s = 0.75) {
require(plyr)
ddply(df, colGrp, here(transform), seuil = quantile(get(colVal), s))

}
The best thing about being a statistician is that you get to play in everyone's backyard.
John Tukey


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité