Regrouper plusieurs niveaux d'un facteur

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

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Marc Chouinard » 27 Déc 2018, 16:47

Bonjour,

- J'aimerais pouvoir rerouper différentes niveaux d'un meme facteur sous une nouvelle appellation. Par exemple dans mon facteur espèce, j'ai plussieurs espèces différentes, mais aussi des espèces qui représentent une seule espèce, mais ortographier différament.

Facteur Espèce: Nombre
Chaboisseaux épine courte 10
Chaboisseaux à épines courte 5
Chaboissedaux à épines courtes 3
Chaboisseau à épine courte 30
Capelan 100
Morue 10
Capelan 10
Sebaste 10

- J'aimerais regrouper les chaboisseaux sous une meme appellation du genre:
Chaboissedaux à épines courtes<-Chaboisseaux épine courte + Chaboisseaux à épines courte + Chaboissedaux à épines courtes + Chaboisseau à épine courte

- Pour obtenir
Facteur Espèce: Nombre
Chaboissedaux à épines courtes 10
Chaboissedaux à épines courtes 5
Chaboissedaux à épines courtes 3
Chaboissedaux à épines courtes 30
Capelan 100
Morue 10
Capelan 10
Sebaste 10


J'aimerais aussi éventuellement pouvoir regrouper plusieurs espècee diverse sous le meme appellation avec ce procédé

Merci

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

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Serge Rapenne » 28 Déc 2018, 09:07

Bonjour,

une approche possible :

Code : Tout sélectionner

dta<-structure(list(Espece = c("Chaboisseaux épine courte", "Chaboisseaux à épines courte","Chaboissedaux à épines courtes", "Chaboisseau à épine courte","Capelan", "Morue boréale", "Capelan", "Morue polaire"),
                    nombre = c(10L, 5L,3L, 30L, 100L, 10L, 10L, 10L)), class = "data.frame", row.names = c(NA,-8L))
#le jeu de donnée d'origine avec une modification pour avoir 2 types de morue
 dta
                          Espece nombre           grp
1      Chaboisseaux épine courte     10  Chaboisseaux
2   Chaboisseaux à épines courte      5  Chaboisseaux
3 Chaboissedaux à épines courtes      3 Chaboissedaux
4     Chaboisseau à épine courte     30   Chaboisseau
5                        Capelan    100       Capelan
6                  Morue boréale     10         Morue
7                        Capelan     10       Capelan
8                  Morue polaire     10         Morue

#on crée un data.frame contenant toute les espèces et leur groupement :
l_modif<-data.frame(origin=c("Chaboisseaux épine courte", "Chaboisseaux à épines courte","Chaboissedaux à épines courtes", "Chaboisseau à épine courte","Capelan", "Morue boréale", "Morue polaire"), nouveau=c("Chaboisseaux", "Chaboisseaux","Chaboisseaux", "Chaboisseaux","Capelan", "Morue", "Morue"))

l_modif
                          origin       nouveau
1      Chaboisseaux épine courte  Chaboisseaux
2   Chaboisseaux à épines courte  Chaboisseaux
3 Chaboissedaux à épines courtes Chaboisseaux
4     Chaboisseau à épine courte   Chaboisseaux
5                        Capelan       Capelan
6                  Morue boréale         Morue
7                  Morue polaire         Morue

On ajoute une colonne aux données avec le groupe :

dta$grp<-l_modif$nouveau[match(dta$Espece,l_modif$origin)]
dta
                          Espece nombre           grp
1      Chaboisseaux épine courte     10  Chaboisseaux
2   Chaboisseaux à épines courte      5  Chaboisseaux
3 Chaboissedaux à épines courtes      3 Chaboisseaux
4     Chaboisseau à épine courte     30   Chaboisseaux
5                        Capelan    100       Capelan
6                  Morue boréale     10         Morue
7                        Capelan     10       Capelan
8                  Morue polaire     10         Morue

#On calcul les sommes par groupe
dta_grp<-aggregate(dta$nombre,list(dta$grp),sum)
> dta_grp
        Group.1   x
1       Capelan 110
2     Chaboisseaux  48
4         Morue  20


Remarque, il est facile de constituer la liste de toutes les espèces pour constituer le data.frame que j'ai appelé l_modif comme ça :

Code : Tout sélectionner

dput(unique(dta$Espece))
c("Chaboisseaux épine courte", "Chaboisseaux à épines courte","Chaboissedaux à épines courtes", "Chaboisseau à épine courte","Capelan", "Morue boréale", "Morue polaire")

Serge

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Marc Chouinard » 02 Jan 2019, 19:20

SAlut

Merci pour la réponse, c'est en effet très approprié. Ce que j'ai oublié de mentionner clairement, c'est que c'est une liste exemple pour illustrer mes donner. Mon jeux de donnée fait plus de 15 000 lignes. J'aimerais donc trouver qqc de plus automaitser, ta manière reviens à tous les changer à la main ou presque.

En fait, j'aimerais pouvoir dire à R, scan la variable Espèces de ma matrice de donnée et quand tu rencontre un nom mal orthograpié ex. "Chaboisseau" ou "Cheboisaux" ou "Chabaoisseaus" (bref comparer a une liste d'appelation incorrecte), remplace le par "Chaboisseaux à épines courtes".

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Marc Chouinard » 02 Jan 2019, 20:52

J'ai qquelque chose comme ca, avec 15000 lignes

Code : Tout sélectionner

Data =Bilan
head(Bilan)

ID Annee nom..lieu.de.capture Station Espèce Nombre Date Mois
1 2014_1 2014 Stn_Littoral_2014 Verveux Aguille 40 2014-05-20 mai
2 2014_2 2014 Stn_Littoral_2014 Verveux Chaboisseau à épine courte 30 2014-05-20 mai
3 2014_3 2014 Stn_Littoral_2014 Verveux Loquette d'amérique 20 2014-05-20 mai
4 2014_4 2014 Stn_Littoral_2014 Verveux Anguille d'amérique 2 2014-05-20 mai
5 2014_5 2014 Stn_Littoral_2014 Verveux Éperlans arc-en-ciel 8 2014-05-20 mai
6 2014_6 2014 Stn_Littoral_2014 Verveux Anguille d'Amérique 1 2014-05-20 mai

Code : Tout sélectionner

Bilan2=Bilan
Bilan2$Group=Bilan2$Espèce
head(Bilan2)


ID Annee nom..lieu.de.capture Station Espèce Nombre Date Mois Groupe
1 2014_1 2014 Stn_Littoral_2014 Verveux Aguille 40 2014-05-20 mai Anguille
2 2014_2 2014 Stn_Littoral_2014 Verveux Chaboisseau à épine courte 30 2014-05-20 mai Chaboisseau à épine courte
3 2014_3 2014 Stn_Littoral_2014 Verveux Loquette d'amérique 20 2014-05-20 mai Loquette d'amérique
4 2014_4 2014 Stn_Littoral_2014 Verveux Anguille d'amérique 2 2014-05-20 mai Anguille d'amérique
5 2014_5 2014 Stn_Littoral_2014 Verveux Éperlans arc-en-ciel 8 2014-05-20 mai Éperlans arc-en-ciel
6 2014_6 2014 Stn_Littoral_2014 Verveux Anguille d'Amérique 1 2014-05-20 mai Anguille d'Amérique



J'ai essayer qqc comme ça qui fonctionne:

Bilan2$Group[Bilan2$Group =="Anguille"]= "ZAnguille"
head(Bilan2)[/code]

ID Annee nom..lieu.de.capture Station Espèce Nombre Date Mois Groupe
1 2014_1 2014 Stn_Littoral_2014 Verveux Aguille 40 2014-05-20 mai ZAnguille
2 2014_2 2014 Stn_Littoral_2014 Verveux Chaboisseau à épine courte 30 2014-05-20 mai Chaboisseau à épine courte
3 2014_3 2014 Stn_Littoral_2014 Verveux Loquette d'amérique 20 2014-05-20 mai Loquette d'amérique
4 2014_4 2014 Stn_Littoral_2014 Verveux Anguille d'amérique 2 2014-05-20 mai Anguille d'amérique
5 2014_5 2014 Stn_Littoral_2014 Verveux Éperlans arc-en-ciel 8 2014-05-20 mai Éperlans arc-en-ciel
6 2014_6 2014 Stn_Littoral_2014 Verveux Anguille d'Amérique 1 2014-05-20 mai Anguille d'Amérique


Mais ce que j'aimerais c'est passer a qqc comme ca pour pouvoir considerer toutes les types d'appélation différentes d'un meme groupe:

Code : Tout sélectionner

Anguille<-c("Anguille","Anguille d'amérique","Anguille d'Amérique")
Bilan2$Group[Bilan2$Group %in% c(Anguille),]= "ZAnguille"


ID Annee nom..lieu.de.capture Station Espèce Nombre Date Mois Groupe
1 2014_1 2014 Stn_Littoral_2014 Verveux Aguille 40 2014-05-20 mai ZAnguille
2 2014_2 2014 Stn_Littoral_2014 Verveux Chaboisseau à épine courte 30 2014-05-20 mai Chaboisseau à épine courte
3 2014_3 2014 Stn_Littoral_2014 Verveux Loquette d'amérique 20 2014-05-20 mai Loquette d'amérique
4 2014_4 2014 Stn_Littoral_2014 Verveux Anguille d'amérique 2 2014-05-20 mai ZAnguille
5 2014_5 2014 Stn_Littoral_2014 Verveux Éperlans arc-en-ciel 8 2014-05-20 mai Éperlans arc-en-ciel
6 2014_6 2014 Stn_Littoral_2014 Verveux Anguille d'Amérique 1 2014-05-20 mai ZAnguille


Cependant ca ne fonctionne pas, j'obtient le message d'errreur:

Error in Bilan2$Group[Bilan2$Group %in% c(Anguille), ] = "ZAnguille" :


J'aimerais pourvoir créer des regroupements d'une facon similaire qui reste simple pour pouvoir joouer a formé différets groups avec mes espèces sans devoir créer des groupe un par un a la main.
incorrect number of subscripts on matrix

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Yves Berrard » 02 Jan 2019, 21:30

Pierre-Marc Chouinard a écrit :Error in Bilan2$Group[Bilan2$Group %in% c(Anguille), ] = "ZAnguille" : [...] incorrect number of subscripts on matrix

Une simple erreur de syntaxe. La virgule est de trop.
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Marc Chouinard » 02 Jan 2019, 21:41

assh une virgule oublié biensûr, Merci

Ça règle mon problème de message d'erreur. Cependant quand j'exécute la commande, il remplace bien Auguille par Zanguille, mais il laisse les autres terme tel quel. Anguille d'amérique reste Anguille d'amérique au lieu d'être remplacé par ZAnguille lui aussi ...

Anguille<-c("Anguille","Anguille d'amérique","Anguille d'Amérique")
Bilan2$Group[Bilan2$Group %in% c(Anguille)]= "ZAnguille"


Si j'essait
Bilan2$Group[Bilan2$Group =="Anguille d'Amérique"]= "ZAnguille" ======= ça marche Anguille d'Amérique est remplacer par ZAnguille
Bilan2$Group[Bilan2$Group =="Anguille "]= "ZAnguille" ======= ça marche Anguille est remplacer par ZAnguille


si je fais:
Anguille<-c("Anguille d'amérique","Anguille d'Amérique","Anguille")
Bilan2$Group[Bilan2$Group %in% c("Anguille")]<- "ZAnguille" ======= Seul Anguille est remplacer par ZAnguille, les autres terme reste inchangés




une idée de ce qui peu accrocher ?

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

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Serge Rapenne » 03 Jan 2019, 08:39

Bonjour,

c'est exactement ce que fait mon code.
Je crée une liste contenant toutes les occurrences avec leur conversion (c'est le data.frame l_modif), j'ajoute un champ contenant la conversion et je somme les effectifs. Ma remarque te permet de surcroit de générer la liste de toutes les orthographes possibles en étant sur de ne pas en oublier.

Serge

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Yves Berrard » 07 Jan 2019, 10:09

Pierre-Marc Chouinard a écrit :Anguille<-c("Anguille d'amérique","Anguille d'Amérique","Anguille")
Bilan2$Group[Bilan2$Group %in% c("Anguille")]<- "ZAnguille" ======= Seul Anguille est remplacer par ZAnguille, les autres terme reste inchangés

Il faut utiliser le vecteur Anguille et pas la chaîne "Anguille" :

Code : Tout sélectionner

Bilan2$Group[Bilan2$Group %in% Anguille] <- "ZAnguille"
PY

Pierre-Marc Chouinard
Messages : 32
Enregistré le : 03 Fév 2017, 13:50

Re: Regrouper plusieurs niveaux d'un facteur

Messagepar Pierre-Marc Chouinard » 07 Jan 2019, 18:12

Merci ça fonctionne


Retourner vers « Questions en cours »

Qui est en ligne

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