Tableau croisé dynamique-comme Sortie dans R?

je suis en train de rédiger un rapport qui nécessite la génération D'un certain nombre de tables pivotantes dans Excel. Je voudrais penser qu'il y a un moyen de le faire à R afin que je puisse éviter Excel. Je voudrais la sortie comme la capture d'écran ci-dessous (noms des enseignants expurgés). Pour autant que je sache, je pourrais utiliser le paquet reshape pour calculer les valeurs agrégées, mais j'aurais besoin de le faire un certain nombre de fois et d'une façon ou d'une autre obtenir toutes les données dans le bon ordre. À ce moment-là, je devrais juste le faire en Excel. Personne ne avez des suggestions ou des recommandations de paquets? Je vous remercie!

(EDIT) Les données commencent par une liste des élèves, de leur enseignant, de l'école et de la croissance. Ces données sont ensuite agrégées pour obtenir une liste des enseignants avec leur croissance moyenne. Veuillez noter que les enseignants sont ensuite regroupés par l'école. Le plus grand problème que je prévois de faire cela avec R dès maintenant est comment obtenir le total partiel et les lignes totales (BSA1 Total, Grand Total, etc) là-dedans car ils ne sont pas le même type d'observation que le les autres? Vous le faire manuellement à calculer eux et essayer de les faire dans le bon ordre afin qu'ils apparaissent au bas de ce groupe?

example

12
demandé sur Community 2011-07-12 19:47:02

4 réponses

Voici un swag au calcul de bits:

set.seed(1)
school  <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T)
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T)
growth <- rnorm(100, 5, 3)

myDf <- data.frame(school, teacher, growth)

require(reshape2)

aggregate(growth ~ school + teacher, data =myDf, FUN=mean)

myDf.melt <- melt(myDf, measured="growth")
dcast(myDf.melt, school + teacher ~ ., fun.aggregate=mean, margins=c("school", "teacher"))

Je n'ai pas abordé le formatage de sortie, seulement le calcul. La base de données résultante devrait ressembler à ceci:

   school teacher       NA
1    BSA1    Dick 4.663140
2    BSA1   Harry 4.310802
3    BSA1     Tom 5.505247
4    BSA1   (all) 4.670451
5    BSA2    Dick 6.110988
6    BSA2   Harry 5.007221
7    BSA2     Tom 4.337063
8    BSA2   (all) 5.196018
9    HSA1    Dick 4.508610
10   HSA1   Harry 4.890741
11   HSA1     Tom 4.721124
12   HSA1   (all) 4.717335
13  (all)   (all) 4.886576

cet exemple utilise le paquet reshape2 pour gérer les sous-totaux.

je pense que R est le bon outil pour le travail ici. Je peux totalement comprendre ne pas être sûr de la façon de commencer sur cette analyse. Je suis venu à R D'Excel il ya quelques années et il peut être difficile à grok au début. Permettez-moi de soulignez quatre conseils pro pour vous aider à obtenir de meilleures réponses dans le débordement de la pile:

1) fournir des données, même si simulé: vous pouvez le voir, j'ai simulé certaines données au début de ma réponse. Si vous aviez fourni cette simulation, j'aurais a) gagné du temps b) obtenu une réponse qui utilise votre propre structure de données, pas une que j'ai imaginée et c) d'autres personnes auraient répondu. Je passe souvent des questions sans données parce que j'en ai marre de deviner les données qu'on leur dit ma réponse. sucé parce que j'ai deviné le mal.

3) continuez à demander! Nous avons tous mieux avec la pratique. Vous essayez de faire plus en R et moins en Excel, donc vous êtes clairement d'une intelligence supérieure à la moyenne. Continue D'utiliser R et de poser des questions. Ça va être plus facile dans le temps.

4) Faites attention avec vos mots quand vous décrivez des choses. Vous dites dans votre édité question, vous avez une "liste" de choses. Une liste en R est une structure de données spécifique. Je me méfie vous avez une trame de données et utilisez le terme "liste" dans un sens générique. Cela peut faire pour une certaine confusion. Il illustre également pourquoi vous voulez fournir vos propres données.

19
répondu JD Long 2011-07-12 16:30:49

en utilisant les données simulées de JD Long, et en ajoutant le sd et les comptes:

   library(reshape)  # not reshape2
   cast(myDf.melt, school + teacher ~ ., margins=TRUE , c(mean, sd, length))
   school teacher     mean       sd length
1    BSA1    Dick 4.663140 3.718773     14
2    BSA1   Harry 4.310802 1.430594      9
3    BSA1     Tom 5.505247 4.045846      4
4    BSA1   (all) 4.670451 3.095980     27
5    BSA2    Dick 6.110988 2.304104     15
6    BSA2   Harry 5.007221 2.908146      9
7    BSA2     Tom 4.337063 2.789244     14
8    BSA2   (all) 5.196018 2.682924     38
9    HSA1    Dick 4.508610 2.946961     11
10   HSA1   Harry 4.890741 2.977305     13
11   HSA1     Tom 4.721124 3.193576     11
12   HSA1   (all) 4.717335 2.950959     35
13  (all)   (all) 4.886576 2.873637    100
10
répondu 42- 2011-07-12 17:26:18

vous trouverez ci-dessous plusieurs façons différentes de générer ceci en utilisant le paquet pivottabler relativement nouveau.

Divulgation: je suis l'auteur du package.

Pour plus d'informations, voir la page package sur CRAN et les diverses vignettes d'emballage disponibles sur cette page.

Données D'Échantillon (le même que ci-dessus)

set.seed(1)
school  <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T)
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T)
growth <- rnorm(100, 5, 3)
myDf <- data.frame(school, teacher, growth)

sortie de table à pivot rapide pour console en texte simple

library(pivottabler)
# arguments:  qhpvt(dataFrame, rows, columns, calculations, ...)
qpvt(myDf, c("school", "teacher"), NULL,  
     c("Average Growth"="mean(growth)", "Std Dev"="sd(growth)",
       "# of Scholars"="n()"),
     formats=list("%.1f", "%.1f", "%.0f"))

Console Sortie:

              Average Growth  Std Dev  # of Scholars  
BSA1   Dick              4.7      3.7             14  
       Harry             4.3      1.4              9  
       Tom               5.5      4.0              4  
       Total             4.7      3.1             27  
BSA2   Dick              6.1      2.3             15  
       Harry             5.0      2.9              9  
       Tom               4.3      2.8             14  
       Total             5.2      2.7             38  
HSA1   Dick              4.5      2.9             11  
       Harry             4.9      3.0             13  
       Tom               4.7      3.2             11  
       Total             4.7      3.0             35  
Total                    4.9      2.9            100  

Rapide tableau croisé dynamique comme la sortie d'un widget html

library(pivottabler)
qhpvt(myDf, c("school", "teacher"), NULL,  
     c("Average Growth"="mean(growth)", "Std Dev"="sd(growth)",
       "# of Scholars"="n()"),
     formats=list("%.1f", "%.1f", "%.0f"))

HTML Widget Output:

enter image description here

Génération d'un tableau croisé dynamique à l'aide de plus de commentaires de syntaxe

il y a plus d'options, par exemple renommer les totaux.

library(pivottabler)
pt <- PivotTable$new()
pt$addData(myDf)
pt$addRowDataGroups("school", totalCaption="(all)")
pt$addRowDataGroups("teacher", totalCaption="(all)")
pt$defineCalculation(calculationName="c1", caption="Average Growth", 
   summariseExpression="mean(growth)", format="%.1f")
pt$defineCalculation(calculationName="c2", caption="Std Dev", 
   summariseExpression="sd(growth)", format="%.1f")
pt$defineCalculation(calculationName="c3", caption="# of Scholars", 
   summariseExpression="n()", format="%.0f")
pt  # to output to console as plain text
pt$renderPivot() # to output as a html widget

HTML Widget Output:

enter image description here

1
répondu cbailiss 2017-06-10 08:18:01

Désolé pour l'autopromotion, mais jetez un oeil à mon paquet expss.

Code pour générer la sortie ci-dessous:

set.seed(1)
school  <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T)
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T)
growth <- rnorm(100, 5, 3)

myDf <- data.frame(school, teacher, growth)

library(expss)
myDf %>% 
    # 'tab_cells' - variables on which statistics will be calculated
    # "|" is needed to suppress 'growth' in row labels
    tab_cells("|" = growth) %>%  
    # 'tab_cols' - variables for columns. Can be ommited
    tab_cols(total(label = "")) %>% 
    # 'tab_rows' - variables for rows.
    tab_rows(school %nest% list(teacher, "(All)"), "|" = "(All)") %>% 
    # 'method = list' is needed for statistics labels in column
    tab_stat_fun("Average Growth" = mean, 
                 "Std Dev" = sd, 
                 "# of scholars" = length, 
                 method = list) %>% 
    # finalize table
    tab_pivot()

le Code ci-dessus donne l'objet hérité des données.cadre pouvant être utilisé avec les opérations standard R (sous-dimensionnement avec [ et etc.). Mais il y a un spécial!--3 -- > méthode pour cet objet. Sortie de la Console:

 |       |       | Average Growth | Std Dev | # of scholars |
 | ----- | ----- | -------------- | ------- | ------------- |
 |  BSA1 |  Dick |            4.7 |     3.7 |            14 |
 |       | Harry |            4.3 |     1.4 |             9 |
 |       |   Tom |            5.5 |     4.0 |             4 |
 |       | (All) |            4.7 |     3.1 |            27 |
 |  BSA2 |  Dick |            6.1 |     2.3 |            15 |
 |       | Harry |            5.0 |     2.9 |             9 |
 |       |   Tom |            4.3 |     2.8 |            14 |
 |       | (All) |            5.2 |     2.7 |            38 |
 |  HSA1 |  Dick |            4.5 |     2.9 |            11 |
 |       | Harry |            4.9 |     3.0 |            13 |
 |       |   Tom |            4.7 |     3.2 |            11 |
 |       | (All) |            4.7 |     3.0 |            35 |
 | (All) |       |            4.9 |     2.9 |           100 |

sortie via htmlTable dans knitr, RStudio de spectateur ou de Brillant:

0
répondu Gregory Demin 2017-06-10 09:30:08