[RESOLU] les fonctions dans la by()

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

Michel Carpentier
Messages : 66
Enregistré le : 04 Fév 2018, 13:49

[RESOLU] les fonctions dans la by()

Messagepar Michel Carpentier » 09 Déc 2018, 17:50

Bonjour,

quelqu'un a-a-il la réponse au fait que R ne trouve pas la fonction mean (ni sd, d'ailleurs) lors de leur utilisation dans la fonction by().
> by(Don[,"Distance"],Don[,"Sexe"],mean)
Error in FUN(dd[x, ], ...) : impossible de trouver la fonction "FUN"
alors qu'avec la fonction sum (ou summary, également) ça marche.
> by(Don[,"Distance"],Don[,"Sexe"],sum)
Don[, "Sexe"]: Filles
[1] 122.8
------------------------------------------------------------
Don[, "Sexe"]: Garçon
[1] 130.3

avec mes remerciements,
cordialement
Michel

François Bonnot
Messages : 461
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: les fonctions dans la by()

Messagepar François Bonnot » 10 Déc 2018, 07:34

Bonjour,
Le code n'est pas reproductible:

Code : Tout sélectionner

> by(Don[,"Distance"],Don[,"Sexe"],sum)
Error in by(Don[, "Distance"], Don[, "Sexe"], sum) :
  object 'Don' not found

Mais avec un code reproductible, tout est normal :

Code : Tout sélectionner

> Don <- data.frame(Sexe="Garçon",Distance=130.3)
> by(Don[,"Distance"],Don[,"Sexe"],sum)
Don[, "Sexe"]: Garçon
[1] 130.3
François

Mickael Canouil
Messages : 450
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: les fonctions dans la by()

Messagepar Mickael Canouil » 10 Déc 2018, 09:23

Bonjour,

il n'y a aucun problème avec les fonctions mean, sd, etc.
En utilisant, l'exemple de François, tout fonctionne parfaitement comme il se doit.
Cependant, il est possible que votre fonction 'by()' ne soit pas celle de 'base'.
Si l'erreur persiste avec le code de François, essayez de rendre l'appel à la fonction explicite:

Code : Tout sélectionner

base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = mean)


Cordialement,
Mickaël

Michel Carpentier
Messages : 66
Enregistré le : 04 Fév 2018, 13:49

Re: les fonctions dans la by()

Messagepar Michel Carpentier » 11 Déc 2018, 10:33

bonjour,

merci pour vos réponses mais en copiant, collant la dernière instruction proposée, j'ai toujours la même réponse.
> base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = mean)
Error in FUN(dd[x, ], ...) : impossible de trouver la fonction "FUN"

alors que quand j'utilise la fonction summary, j'ai la réponse attendue
> by(Don[,"Distance"],Don[,"Sexe"],summary)
Don[, "Sexe"]: Filles
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 10.88 12.35 12.28 13.35 14.50
------------------------------------------------------------
Don[, "Sexe"]: Garçon
Min. 1st Qu. Median Mean 3rd Qu. Max.
9.20 9.70 10.50 10.86 11.72 13.70

j'ai pris les données à l'adresse ci-dessous

>Don <- read.table("http://math.agrocampus-ouest.fr/math/husson/
+StatUtilisateurExo/chap3_ex4.csv", header = TRUE,sep=";")

cordialement

Michel

Eric Wajnberg
Messages : 642
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: les fonctions dans la by()

Messagepar Eric Wajnberg » 11 Déc 2018, 10:43

De mon côté, tout fonctionne correctement :

Code : Tout sélectionner

> Don <- read.table("http://math.agrocampus-ouest.fr/math/husson/StatUtilisateurExo/chap3_ex4.csv", header = TRUE,sep=";")
> base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = mean)
Don[, "Sexe"]: Filles
[1] 12.28
-------------------------------------------------------------------------------------------------------------
Don[, "Sexe"]: Garçon
[1] 10.85833
> by(Don[,"Distance"],Don[,"Sexe"],summary)
Don[, "Sexe"]: Filles
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  10.40   10.88   12.35   12.28   13.35   14.50
-------------------------------------------------------------------------------------------------------------
Don[, "Sexe"]: Garçon
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
   9.20    9.70   10.50   10.86   11.72   13.70


Vous être sûr que l'objet "mean" de votre côté correspond bien à la fonction mean native de R.

Regardez le résultat suivant :

Code : Tout sélectionner

> mean=12
>  base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = mean)
Error in FUN(dd[x, ], ...) : impossible de trouver la fonction "FUN"


HTH, Eric.

Eric Wajnberg
Messages : 642
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: les fonctions dans la by()

Messagepar Eric Wajnberg » 11 Déc 2018, 10:44

De mon côté, tout fonctionne correctement :

Code : Tout sélectionner

> Don <- read.table("http://math.agrocampus-ouest.fr/math/husson/StatUtilisateurExo/chap3_ex4.csv", header = TRUE,sep=";")
> base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = mean)
Don[, "Sexe"]: Filles
[1] 12.28
-------------------------------------------------------------------------------------------------------------
Don[, "Sexe"]: Garçon
[1] 10.85833
> by(Don[,"Distance"],Don[,"Sexe"],summary)
Don[, "Sexe"]: Filles
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  10.40   10.88   12.35   12.28   13.35   14.50
-------------------------------------------------------------------------------------------------------------
Don[, "Sexe"]: Garçon
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
   9.20    9.70   10.50   10.86   11.72   13.70


Vous être sûr que l'objet "mean" de votre côté correspond bien à la fonction mean() native de R ?

Regardez le résultat suivant :

Code : Tout sélectionner

> mean=12
>  base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = mean)
Error in FUN(dd[x, ], ...) : impossible de trouver la fonction "FUN"


HTH, Eric.

Eric Wajnberg
Messages : 642
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: les fonctions dans la by()

Messagepar Eric Wajnberg » 11 Déc 2018, 10:47

Désolé pour le doublon. Un problème (à présent résolu) sur mon browser..

Eric.

Serge Rapenne
Messages : 1235
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: les fonctions dans la by()

Messagepar Serge Rapenne » 11 Déc 2018, 10:49

Pour completer la reponse d'Eric,

si

Code : Tout sélectionner

mean
retourne autre chose que

Code : Tout sélectionner

function (x, ...)
UseMethod("mean")
<bytecode: 0x557d1440c0b0>
<environment: namespace:base>
c'est que tu as reaffecté mean

Serge

Michel Carpentier
Messages : 66
Enregistré le : 04 Fév 2018, 13:49

Re: les fonctions dans la by()

Messagepar Michel Carpentier » 11 Déc 2018, 11:45

merci pour votre aide.
j'ai compris qu'il ne faut jamais utiliser le nom d'une fonction comme variable.
désolé.

Michel

Eric Wajnberg
Messages : 642
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: les fonctions dans la by()

Messagepar Eric Wajnberg » 11 Déc 2018, 11:49

Michel Carpentier a écrit :merci pour votre aide.
j'ai compris qu'il ne faut jamais utiliser le nom d'une fonction comme variable.

Content que le problème soit résolu, mais je ne conclurais pas l'histoire comme ceci. Il y a tellement de noms de fonction disponibles dans R (si on prend en compte tous les packages) qu'il finit toujours par arriver qu'on utilise, pour ses propres objects, des noms déjà existants. R est conçu pour supporter ceci. La clef, en revanche, c'est d'identifier ce genre de problèmes, lorsqu'ils se produisent, et de savoir comment agir en conséquence.

Eric.

Serge Rapenne
Messages : 1235
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: [RESOLU] les fonctions dans la by()

Messagepar Serge Rapenne » 11 Déc 2018, 13:03

Sans parler du problème des fonctions qui ont le même nom. Par ex J'utilise régulièrement dplyr et raster qui ont tous les deux une fonctions "select" ce qui m'a un peu perturbé il y a qq temps. Maintenant, je fais bcp plus attention aux messages lors du chargement des packages.

Serge

Eric Wajnberg
Messages : 642
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: [RESOLU] les fonctions dans la by()

Messagepar Eric Wajnberg » 12 Déc 2018, 06:56

Juste un point pour développer (et clore ?) cette discussion. Il est des cas où l'on peu utiliser avec avantage le fait de pouvoir définir des objets qui ont le même nom que des fonctions déjà existantes dans R. Ca m'arrive notamment de remplacer ainsi des fonctions R par des fonctions perso, dans lesquelles je "customise" (enrichie) les sorties. Très pratique.

HTH, Eric.

Mickael Canouil
Messages : 450
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: [RESOLU] les fonctions dans la by()

Messagepar Mickael Canouil » 12 Déc 2018, 09:23

Bonjour,

pour n'avoir aucun problème avec des noms de fonctions dans de multiples packages, ou affectés à des noms de packages, il suffit d'être extrême dans le côté explicite de la commande:

Code : Tout sélectionner

base::by(data = Don[, "Distance"], INDICES = Don[, "Sexe"], FUN = base::mean)

Dans ce cas, il n'y a aucun problème et ce peu importe l'ordre de chargement des packages R.

Enfin, pour la gestion des conflits, le combo "prefixer" (https://github.com/dreamRs/prefixer) et "conflicted" (https://github.com/r-lib/conflicted ou https://cran.r-project.org/package=conflicted) est particulièrement efficace.

Et une petite fonction utile a lancer après les chargements des packages pour se rendre compte des fonctions masqués et par quoi: 'tidyverse::tidyverse_conflicts()'.

Cordialement,
Mickaël


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité