Créer un tableau après une requête tapply(.,.,summary) ?

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

Romain Pillot
Messages : 21
Enregistré le : 27 Juin 2011, 15:51

Créer un tableau après une requête tapply(.,.,summary) ?

Messagepar Romain Pillot » 20 Aoû 2011, 20:50

Bonsoir,
J'ai 1000 individus, provenant de 50 échantillons, dans un tableau. Je souhaite caractériser tout les échantillons un à un et enregistrer le résultat dans un tableau.
://romain.pillot.free.fr/Stat/R/Wolm_NA_Alt.txt

Code : Tout sélectionner

tapply(l, Quad*10-Prof, summary)

me donne
$`12`
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.20 11.42 13.05 15.10 22.05 33.70

$`42`
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.20 9.90 11.85 13.80 14.12 39.00
...
Mais je ne peut rien en faire car ce n'est pas un tableau. J'aurai souhaité une forme comme ça :
$ Min. 1st Qu. Median Mean 3rd Qu. Max.
12 1.20 11.42 13.05 15.10 22.05 33.70
42 2.20 9.90 11.85 13.80 14.12 39.00
...
Comment faire un tableau ?

merci
®

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 20 Aoû 2011, 22:43

Code : Tout sélectionner

> y <- rnorm(300)
> x <- sample(c("A", "B", "C"), size = 300, replace = TRUE)
> tapply(y, x, summary)
$A
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
-2.86700 -0.65920  0.05775  0.07535  0.93910  2.15600

$B
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
-1.8830 -0.9166 -0.2145 -0.1564  0.4660  2.2570

$C
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
-2.28500 -0.75230 -0.15170 -0.08873  0.64450  2.25100

> do.call("rbind", tapply(y, x, summary))
    Min. 1st Qu.   Median     Mean 3rd Qu.  Max.
A -2.867 -0.6592  0.05775  0.07535  0.9391 2.156
B -1.883 -0.9166 -0.21450 -0.15640  0.4660 2.257
C -2.285 -0.7523 -0.15170 -0.08873  0.6445 2.251
Renaud

Romain Pillot
Messages : 21
Enregistré le : 27 Juin 2011, 15:51

Nommer la 1ére colonne

Messagepar Romain Pillot » 21 Aoû 2011, 11:39

impeccable
Comment nommer la 1ére colonne ? Pour faire une jointure avec.
merci

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 22 Aoû 2011, 07:36

Bonjour,

On peut faire comme ça :

Code : Tout sélectionner

tableau <- do.call("rbind", tapply(y, x, summary))
colnames(tableau)[1] <- "Nouveau nom"
Matthieu FARON

Romain Pillot
Messages : 21
Enregistré le : 27 Juin 2011, 15:51

Nommer la 1ére colonne

Messagepar Romain Pillot » 22 Aoû 2011, 09:22

Bonjour,

C'est curieux c'est la seconde colonne qui est renommée !

Code : Tout sélectionner

> colnames(Quan)[1] <- "Nouveau"
> Quan
    Nouveau   X10.   X16.  X60.    X84.   X90.    X95.
12  11.5500 11.800 12.340 19.20 27.5800 28.900 31.3000
42  10.1000 10.800 11.412 13.30 21.4520 27.380 33.1900

Mon fichier ://romain.pillot.free.fr/Stat/R/Wolm/Quan.txt s'ouvre correctement dans R mais dans un tableur ou traitement de texte les titres des colonnes sont décalés vers la gauche, il n'y a pas de "vide" pour la 1ére colonne.

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 22 Aoû 2011, 09:39

Bonjour,

Dans votre exemple :

* Sur R : c'est bien la première colonne qui est renommée, les chiffres que l'on voit avant correspondent au numéro de ligne (ce n'est donc pas une colonne). Si c'est ça que tu voulais utiliser c'est toujours possible de le reprendre :

Code : Tout sélectionner

tableau$id <- as.numeric(rownames(tableau))


* Sur excel : j'ai exactement le même problème de décalage....
une solution quand c'est possible ne pas inclure le numéro de ligne avec l'option row.names=FALSE
Peut être en changeant le séparateur pour autre chose que \t ça pourrait marcher mieux ?
Matthieu FARON

Romain Pillot
Messages : 21
Enregistré le : 27 Juin 2011, 15:51

Jointure possible avec le numéro de ligne ?

Messagepar Romain Pillot » 22 Aoû 2011, 18:03

Nickel !
Pour faire + simple, ne peut-on pas faire une jointure avec le numéro de ligne ?
merci
®

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Messagepar matthieu faron » 22 Aoû 2011, 18:22

Apparemment si vous fusionnez avec merge vous pouvez mettre comme paramètre à l'argument by "row.names" pour fusionner par les numeros de lignes.

A noter que si les deux jeu de données ont la même longueur et qu'il n'y a pas de répétitions (1 ligne par sujet) il est plus rapide de faire un cbind()
Matthieu FARON

Geoffrey Gimonneau
Messages : 23
Enregistré le : 04 Aoû 2011, 19:46

Re: Créer un tableau après une requette tapply(.,.,summary) ?

Messagepar Geoffrey Gimonneau » 13 Sep 2018, 16:38

Bonjour,
je me permets de reprendre ce sujet car j'ai un problème similaire mais que je n'arrive pas à résoudre avec l'explication ci dessus.
J'ai deux objets que je récupère de la fonction tapply,

Code : Tout sélectionner

> prod=tapply(toto$produit,toto$Compose,sum)
> prod
         2-phenoxyEthanol              2-Undecanone 2,4,6-trimethylpyrimidine                    Citral
                       11                        10                        12                        10
            Hexanoic Acid           Iso-Citronellol             Octanoic acid         Phenylcyclohexane
                        0                        14                        11                        14
> sand=tapply(toto$sable,toto$Compose,sum)
> sand
         2-phenoxyEthanol              2-Undecanone 2,4,6-trimethylpyrimidine                    Citral
                        9                        10                         8                        10
            Hexanoic Acid           Iso-Citronellol             Octanoic acid         Phenylcyclohexane
                       15                         6                         9                         6

que je combine ensuite avec un cbind pour créer un tableau de synthèse.

Code : Tout sélectionner

tableau= cbind(prod,sand)
> tableau
                          prod sand
2-phenoxyEthanol            11    9
2-Undecanone                10   10
2,4,6-trimethylpyrimidine   12    8
Citral                      10   10
Hexanoic Acid                0   15
Iso-Citronellol             14    6
Octanoic acid               11    9
Phenylcyclohexane           14    6

J'obtiens un objet avec 8 lignes et 2 colones. Cependant, je souhaites que le nom des produits soit également une colonne et non pas ici considéré comme identifiant des lignes, si je ne m'abuse.
Si je le passe en data.frame, l'output est identique. Je dois avoir un problème d'argument dans une fonction mais je n'ai pas trouvé...
Merci pour votre aide.

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

Re: Créer un tableau après une requette tapply(.,.,summary) ?

Messagepar Pierre-Yves Berrard » 14 Sep 2018, 09:43

Bonjour,

Le plus simple serait d'utiliser aggregate qui renvoie un data.frame :

Code : Tout sélectionner

aggregate(data = toto, cbind(produit, sable) ~ Compose, sum)
PY


Retourner vers « Questions en cours »

Qui est en ligne

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