aggregate et changer le nom des colonnes

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

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

aggregate et changer le nom des colonnes

Messagepar Eric Wajnberg » 20 Déc 2020, 17:07

Bonjour à tous.

Voici ma question du jour :

J'ai le jeu de données bidon suivante :

Code : Tout sélectionner

> bidon
   Fact1 Fact2 repet valeur
1      A     C     1      1
2      A     C     1      3
3      A     C     2      5
4      A     C     2      4
5      A     D     3      5
6      A     D     3      7
7      A     D     4      2
8      A     D     4      4
9      B     C     5     10
10     B     C     5      4
11     B     C     6      0
12     B     C     6      5
13     B     D     7      6
14     B     D     7      3
15     B     D     8      5
16     B     D     8      3

Je veux calculer les moyennes et SD de chaque répétition pour les deux facteurs:

Code : Tout sélectionner

> resultat=aggregate(valeur~Fact1:Fact2:repet,FUN=function(x) c(mean(x), sd(x)),data=bidon)
> resultat
  Fact1 Fact2 repet  valeur.1  valeur.2
1     A     C     1 2.0000000 1.4142136
2     A     C     2 4.5000000 0.7071068
3     A     D     3 6.0000000 1.4142136
4     A     D     4 3.0000000 1.4142136
5     B     C     5 7.0000000 4.2426407
6     B     C     6 2.5000000 3.5355339
7     B     D     7 4.5000000 2.1213203
8     B     D     8 4.0000000 1.4142136

So far, so good.

Je ne suis pas satisfait des labels des colonnes créées, et je voulais naïvement les changer avec names() (ou colnames()). Ce n'est pas possible, car la dimension de ce dataframe n'est pas 8x5.

Code : Tout sélectionner

> dim(resultat)
[1] 8 4

Les deux dernières colonnes sont combinées.

Code : Tout sélectionner

> resultat[,4]
     [,1]      [,2]
[1,]  2.0 1.4142136
[2,]  4.5 0.7071068
[3,]  6.0 1.4142136
[4,]  3.0 1.4142136
[5,]  7.0 4.2426407
[6,]  2.5 3.5355339
[7,]  4.5 2.1213203
[8,]  4.0 1.4142136

Et, du coup, changer juste le label de la colonne 4 change d'un coup les deux dernières :

Code : Tout sélectionner

> names(resultat)[4]="moyenne"
> resultat
  Fact1 Fact2 repet moyenne.1 moyenne.2
1     A     C     1 2.0000000 1.4142136
2     A     C     2 4.5000000 0.7071068
3     A     D     3 6.0000000 1.4142136
4     A     D     4 3.0000000 1.4142136
5     B     C     5 7.0000000 4.2426407
6     B     C     6 2.5000000 3.5355339
7     B     D     7 4.5000000 2.1213203
8     B     D     8 4.0000000 1.4142136

Quelqu'un aurait une astuce pour changer les noms des deux dernières colonnes séparément ?

D'avance merci pour toute aide sur ce point.

Et bonnes fêtes ! Eric.

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

Re: aggregate et changer le nom des colonnes

Messagepar Eric Wajnberg » 20 Déc 2020, 17:14

Je me réponds à moi-même. J'ai trouvé un premier moyen de m'en sortir :

Code : Tout sélectionner

> resultat=aggregate(valeur~Fact1:Fact2:repet,FUN=function(x) c(mean=mean(x), sd=sd(x)),data=bidon)
> resultat
  Fact1 Fact2 repet valeur.mean valeur.sd
1     A     C     1   2.0000000 1.4142136
2     A     C     2   4.5000000 0.7071068
3     A     D     3   6.0000000 1.4142136
4     A     D     4   3.0000000 1.4142136
5     B     C     5   7.0000000 4.2426407
6     B     C     6   2.5000000 3.5355339
7     B     D     7   4.5000000 2.1213203
8     B     D     8   4.0000000 1.4142136
>

C'est mieux que rien, même si ce n'est pas parfait.

Eric.

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: aggregate et changer le nom des colonnes

Messagepar jean lobry » 20 Déc 2020, 17:44

Bonjour Éric,

j'ai rien compris. Tu peux donner un code reproductible ?

A+

jean lobry

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

Re: aggregate et changer le nom des colonnes

Messagepar Eric Wajnberg » 20 Déc 2020, 17:49

Salut Jean,

Je ne suis pas clair ? Mon code est reproductible il me semble. J'ai l'impression d'être clair, avec des exemples, etc..

Seule le jeu de données "bidon" n'est pas donné en format R. Le voici :

Code : Tout sélectionner

> dput(bidon)
structure(list(Fact1 = c("A", "A", "A", "A", "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "B", "B"), Fact2 = c("C", "C",
"C", "C", "D", "D", "D", "D", "C", "C", "C", "C", "D", "D", "D",
"D"), repet = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L,
7L, 7L, 8L, 8L), valeur = c(1L, 3L, 5L, 4L, 5L, 7L, 2L, 4L, 10L,
4L, 0L, 5L, 6L, 3L, 5L, 3L)), class = "data.frame", row.names = c(NA,
-16L))


Eric.

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: aggregate et changer le nom des colonnes

Messagepar jean lobry » 21 Déc 2020, 08:00

Bonjour Éric,

c'est beaucoup plus clair comme ça ! En aval tu peux aussi faire

Code : Tout sélectionner

bidon <- structure(list(Fact1 = c("A", "A", "A", "A", "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "B", "B"), Fact2 = c("C", "C",
"C", "C", "D", "D", "D", "D", "C", "C", "C", "C", "D", "D", "D",
"D"), repet = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L,
7L, 7L, 8L, 8L), valeur = c(1L, 3L, 5L, 4L, 5L, 7L, 2L, 4L, 10L,
4L, 0L, 5L, 6L, 3L, 5L, 3L)), class = "data.frame", row.names = c(NA,
-16L))
resultat <- aggregate(valeur~Fact1:Fact2:repet,FUN=function(x) c(mean(x), sd(x)),data=bidon)
colnames(resultat$valeur) <- c("mean", "sd")


Ou bien si tu veux "remonter" la table d'un cran :

Code : Tout sélectionner

resultat$mean <- resultat$valeur[, 1]
resultat$sd <- resultat$valeur[, 2]
resultat$valeur <- NULL
resultat
  Fact1 Fact2 repet mean        sd
1     A     C     1  2.0 1.4142136
2     A     C     2  4.5 0.7071068
3     A     D     3  6.0 1.4142136
4     A     D     4  3.0 1.4142136
5     B     C     5  7.0 4.2426407
6     B     C     6  2.5 3.5355339
7     B     D     7  4.5 2.1213203
8     B     D     8  4.0 1.4142136


Bien amicalement,

jean lobry

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

Re: aggregate et changer le nom des colonnes

Messagepar Eric Wajnberg » 21 Déc 2020, 08:05

Merci,

Eric.

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

Re: aggregate et changer le nom des colonnes

Messagepar Mickael Canouil » 21 Déc 2020, 11:50

Bonjour,

sur la base de l'approche de Jean, mais avec un cbind:

Code : Tout sélectionner

bidon <- structure(list(Fact1 = c("A", "A", "A", "A", "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "B", "B"), Fact2 = c("C", "C",
"C", "C", "D", "D", "D", "D", "C", "C", "C", "C", "D", "D", "D",
"D"), repet = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L,
7L, 7L, 8L, 8L), valeur = c(1L, 3L, 5L, 4L, 5L, 7L, 2L, 4L, 10L,
4L, 0L, 5L, 6L, 3L, 5L, 3L)), class = "data.frame", row.names = c(NA,
-
16L))
resultat <- aggregate(
  formula = valeur ~ Fact1:Fact2:repet,
  data = bidon,
  FUN = function(x) c(mean = mean(x), sd = sd(x))
)

Code : Tout sélectionner

cbind(
  resultat[, -grep("valeur", names(resultat))], 
  resultat
[, grep("valeur", names(resultat))]
)
#>   Fact1 Fact2 repet mean        sd
#> 1     A     C     1  2.0 1.4142136
#> 2     A     C     2  4.5 0.7071068
#> 3     A     D     3  6.0 1.4142136
#> 4     A     D     4  3.0 1.4142136
#> 5     B     C     5  7.0 4.2426407
#> 6     B     C     6  2.5 3.5355339
#> 7     B     D     7  4.5 2.1213203
#> 8     B     D     8  4.0 1.4142136   
Mickaël
mickael.canouil.fr | rlille.fr

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: aggregate et changer le nom des colonnes

Messagepar jean lobry » 21 Déc 2020, 17:12

Bonjour Mickael,

Joli ! C'est plus générique comme ça.

Et en parlant de joli, comment fais-tu pour avoir de la colorisation syntaxique dans tes fragments de code ?

Bien amicalement,

jean lobry

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

Re: aggregate et changer le nom des colonnes

Messagepar Eric Wajnberg » 21 Déc 2020, 17:21

Pour la colorisation dans les codes, il suffit de remplacer :

[code]

par

[code=php]

Eric.

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

Re: aggregate et changer le nom des colonnes

Messagepar Mickael Canouil » 22 Déc 2020, 08:21

"coloration syntaxique" il faut le dire vite ^^

Comme ce n'est pas le bon langage (version trop trop vieille de phpbb), uniquement les commentaires, symboles et les chaines de caractères sont reconnus, mais avec un reprex (j'ai un fork avec reprex_bb() spécialement pour le forum https://github.com/mcanouil/reprex, un jour je ferai un PR sur le dépôt source) cela permet au moins de distinguer le code de la sortie.
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

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