factor ou as.factor

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 lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

factor ou as.factor

Messagepar michel lutz » 23 Juil 2014, 06:56

Bonjour,

Je me pose une petite question : quelles sont les différences fondamentales entre factor et as.factor ?
Dans quel cas utiliser l'une ou l'autre fonction ?

Merci d'avance !

Michel

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 23 Juil 2014, 07:05

Bonjour,

d'après l'aide j'ai bien l'impression que si tu veux ordonner les niveaux, modifier le nom des niveaux, leur donner un label ou d'autres petites choses, seul factor() le fait. De son côté as.factor() ne fait que transformer tel quel en facteur, un point c'est tout.

Maxime

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Messagepar michel lutz » 23 Juil 2014, 07:12

ok, merci pour cette réponse Maxime.
Donc pas de différence fondamentale... en tout cas, pas de quoi fausser les résultats si l'on utilise l'une ou l'autre des fonctions !
Merci et bonne journée !

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 23 Juil 2014, 08:09

Bonjour,

Attention il existe tout de même au moins une différence si tu utilises factor à la place de as.factor. Ce dernier conserve toujours tous les niveaux d'un facteur alors que l'utilisation de factor supprime les niveaux vides (modalités non représentées). Il faut donc faire attention quand on fait des allers et venues entre la classe factor et d'autre classe.

Nicolas

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Messagepar michel lutz » 23 Juil 2014, 10:41

OK ! Merci beaucoup pour cette information intéressante, je prends bonne note ! ;-)

Yves Rousselle
Messages : 47
Enregistré le : 26 Nov 2007, 13:25

Messagepar Yves Rousselle » 25 Juil 2014, 07:02

Je manipule pas mal les facteurs et je peste assez souvent sur ce comportement qui consiste à conserver un niveau de facteur vide. Je passe alors par un as.character ou par un as.numeric pour "rafraîchir" mes niveaux de facteurs.

Nicolas Péru a écrit :Ce dernier conserve toujours tous les niveaux d'un facteur alors que l'utilisation de factor supprime les niveaux vides (modalités non représentées).


Nicolas, pourrais-tu détailler et montrer un exemple de ce que tu dis s'il te plaît, j'ai fait quelques essais mais je n'ai pas vu de différences entre les deux fonctions.

Maxime Hervé
Messages : 427
Enregistré le : 03 Mar 2010, 14:21
Contact :

Messagepar Maxime Hervé » 25 Juil 2014, 07:39

Un exemple :

Code : Tout sélectionner

> (f1 <- gl(3,1,labels=LETTERS[1:3]))
[1] A B C
Levels: A B C
> (f2 <- f1[f1!="B"])
[1] A C
Levels: A B C
> (f3 <- factor(f2))
[1] A C
Levels: A C
> (f4 <- as.factor(f2))
[1] A C
Levels: A B C


Pour éviter de passer par un as.character() ou as.numeric(), il y a droplevels() sinon qui est bien pratique.

Maxime

Yves Rousselle
Messages : 47
Enregistré le : 26 Nov 2007, 13:25

Messagepar Yves Rousselle » 25 Juil 2014, 08:02

OK, merci pour cet exemple. Mais donc c'est bien au moment de l'application de factor() ou as.factor() que la différence joue. L'objet produit n'est pas affecté. Je continue l'exemple de Maxime Hervé pour illustrer mon propos :

Code : Tout sélectionner

> (f1 <- gl(3,1,labels=LETTERS[1:3]))
[1] A B C
Levels: A B C
> (f2 <- f1[f1!="B"])
[1] A C
Levels: A B C
> (f3 <- factor(f2))
[1] A C
Levels: A C
> (f5 <- f3[f3 != "A"])
[1] C
Levels: A C

L'objet f3, créé par la fonction factor() a bien le comportement classique de conservation des niveaux de facteur vides.

Maxime Hervé a écrit :Pour éviter de passer par un as.character() ou as.numeric(), il y a droplevels() sinon qui est bien pratique.


Il faut que je m'en rappelle de celle là, ce n'est pas la première fois qu'on me le dit...

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

Messagepar Didier Plat » 25 Juil 2014, 08:16

Bonjour,
Ou peut aussi éviter droplevel() en spécifiant directement drop=TRUE dans la création du nouvel objet. Pour suivre le fil des exemples :

Code : Tout sélectionner

(f5 <- f3[f3 != "A", drop=TRUE])
[1] C
Levels: C

Mais il est certain que cela ne modifie pas les propriétés de l'objet et demande à être reprécisé à chaque recréation.

Yves Rousselle
Messages : 47
Enregistré le : 26 Nov 2007, 13:25

Messagepar Yves Rousselle » 25 Juil 2014, 08:21

C'est beau R : on en découvre tous les jours, même sur des fonctions qu'on utilise tout le temps.

On peut mettre des arguments dans des crochets qui servent à spécifier des sélections ?! Quelle souplesse ce R !

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

Messagepar Didier Plat » 25 Juil 2014, 08:52

Oui, ça permet aussi de conserver certaines propriétés, ce qui peut être bien utile parfois :

Code : Tout sélectionner

toto<-data.frame(x=1:3, , y=4:6)

class(toto[,1])
[1] "integer"

class(toto[,1, drop=TRUE]) # la valeur implicite
[1] "integer"

class(toto[,1, drop=FALSE])
[1] "data.frame"


Retourner vers « Questions en cours »

Qui est en ligne

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