Existe-t-il un équivalent R de SAS PROC FREQ?


18

Quelqu'un connaît-il un R équivalent à SAS PROC FREQ?

J'essaie de générer des statistiques descriptives résumées pour plusieurs variables à la fois.


2
Pourquoi cette question a-t-elle été close? Il concerne la visualisation des données et a généré plusieurs réponses intéressantes.
z0lo

Réponses:


12

J'utilise tableet prop.table, mais CrossTabledans le gmodelspackage pourrait vous donner des résultats encore plus proches de SAS. Voir ce lien .

De plus, pour générer des "statistiques descriptives pour plusieurs variables à la fois", vous utiliseriez la summaryfonction; par exemple summary(mydata).


En outre, je recommande vivement le package vcd , mais consultez la vignette ci-jointe: Travailler avec des données catégorielles avec R et les packages vcd et vcdExtra .
chl

9

La synthèse des données dans la base R n'est qu'un casse-tête. C'est l'un des domaines où SAS fonctionne assez bien. Pour R, je recommande le plyrpackage.

En SAS:

/* tabulate by a and b, with summary stats for x and y in each cell */
proc summary data=dat nway;
  class a b;
  var x y;
  output out=smry mean(x)=xmean mean(y)=ymean var(y)=yvar;
run;

avec plyr:

smry <- ddply(dat, .(a, b), summarise, xmean=mean(x), ymean=mean(y), yvar=var(y))

8

Je n'utilise pas SAS; donc je ne peux pas dire si la réplication suivante SAS PROC FREQ, mais ce sont deux stratégies rapides pour décrire les variables dans un data.frame que j'utilise souvent:

  • describedans Hmiscfournit un résumé utile des variables, y compris des données numériques et non numériques
  • describedans psychfournit des statistiques descriptives pour les données numériques

Exemple R

> library(MASS) # provides dataset called "survey"
> library(Hmisc) # Hmisc describe
> library(psych) # psych describe

Voici la sortie de Hmisc describe:

> Hmisc::describe(survey)
survey 

 12  Variables      237  Observations
----------------------------------------------------------------------------------------------------------------------
Sex 
      n missing  unique 
    236       1       2 

Female (118, 50%), Male (118, 50%) 
----------------------------------------------------------------------------------------------------------------------
Wr.Hnd 
      n missing  unique    Mean     .05     .10     .25     .50     .75     .90     .95 
    236       1      60   18.67   16.00   16.50   17.50   18.50   19.80   21.15   22.05 

lowest : 13.0 14.0 15.0 15.4 15.5, highest: 22.5 22.8 23.0 23.1 23.2 
----------------------------------------------------------------------------------------------------------------------
NW.Hnd 
      n missing  unique    Mean     .05     .10     .25     .50     .75     .90     .95 
    236       1      68   18.58   15.50   16.30   17.50   18.50   19.72   21.00   22.22 

lowest : 12.5 13.0 13.3 13.5 15.0, highest: 22.7 23.0 23.2 23.3 23.5 
----------------------------------------------------------------------------------------------------------------------
[ABBREVIATED OUTPUT]

Ensuite, voici la sortie de psych describepour les variables numériques:

> psych::describe(survey[,sapply(survey, class) %in% c("numeric", "integer") ])
       var   n   mean    sd median trimmed   mad    min   max range  skew kurtosis   se
Wr.Hnd   1 236  18.67  1.88  18.50   18.61  1.48  13.00  23.2 10.20  0.18     0.36 0.12
NW.Hnd   2 236  18.58  1.97  18.50   18.55  1.63  12.50  23.5 11.00  0.02     0.51 0.13
Pulse    3 192  74.15 11.69  72.50   74.02 11.12  35.00 104.0 69.00 -0.02     0.41 0.84
Height   4 209 172.38  9.85 171.00  172.19 10.08 150.00 200.0 50.00  0.22    -0.39 0.68
Age      5 237  20.37  6.47  18.58   18.99  1.61  16.75  73.0 56.25  5.16    34.53 0.42

3

J'utilise la fonction livre de codes de {EPICALC} qui donne des statistiques récapitulatives pour une variable numérique et une table de fréquence avec des étiquettes de niveau et des codes pour les facteurs. http://cran.r-project.org/doc/contrib/Epicalc_Book.pdf (voir p.50) De plus, cela est très utile car il fournit sd pour les variables quantitatives.

Prendre plaisir !

exemple de sortie


1
+1 (plus tôt). J'aime vraiment la façon dont codebook()cela se présente. Un problème est que les nas sont supprimés, que vous souhaiterez peut-être inclure dans votre sortie. Une façon de gérer ce problème (au moins avec les facteurs) consiste à utiliser ? Recode.is.na 1er (par exemple, "manquant"); pour les variables numériques, vous pouvez créer une nouvelle variable immédiatement à gauche de la colonne avec une valeur logique basée sur is.na(), puis exécuter codebook(). C'est un peu kluge, cependant.
gung - Rétablir Monica

3

Vous pouvez consulter mon package summarytools ( lien CRAN ) qui comprend une fonction de type livre de codes, avec des options de mise en forme et de formatage html.

install.packages("summarytools")
library(summarytools)
dfSummary(CO2, style = "grid", plain.ascii = TRUE)

Résumé de la trame de données

CO2

+------------+---------------+-------------------------------------+--------------------+-----------+
| Variable   | Properties    | Stats / Values                      | Freqs, % Valid     | N Valid   |
+============+===============+=====================================+====================+===========+
| Plant      | type:integer  | 1. Qn1                              | 1: 7 (8.3%)        | 84/84     |
|            | class:ordered | 2. Qn2                              | 2: 7 (8.3%)        | (100.0%)  |
|            | + factor      | 3. Qn3                              | 3: 7 (8.3%)        |           |
|            |               | 4. Qc1                              | 4: 7 (8.3%)        |           |
|            |               | 5. Qc3                              | 5: 7 (8.3%)        |           |
|            |               | 6. Qc2                              | 6: 7 (8.3%)        |           |
|            |               | 7. Mn3                              | 7: 7 (8.3%)        |           |
|            |               | 8. Mn2                              | 8: 7 (8.3%)        |           |
|            |               | 9. Mn1                              | 9: 7 (8.3%)        |           |
|            |               | 10. Mc2                             | 10: 7 (8.3%)       |           |
|            |               | ... 2 other levels                  | others: 14 (16.7%) |           |
+------------+---------------+-------------------------------------+--------------------+-----------+
| Type       | type:integer  | 1. Quebec                           | 1: 42 (50%)        | 84/84     |
|            | class:factor  | 2. Mississippi                      | 2: 42 (50%)        | (100.0%)  |
+------------+---------------+-------------------------------------+--------------------+-----------+
| Treatment  | type:integer  | 1. nonchilled                       | 1: 42 (50%)        | 84/84     |
|            | class:factor  | 2. chilled                          | 2: 42 (50%)        | (100.0%)  |
+------------+---------------+-------------------------------------+--------------------+-----------+
| conc       | type:double   | mean (sd) = 435 (295.92)            | 95: 12 (14.3%)     | 84/84     |
|            | class:numeric | min < med < max = 95 < 350 < 1000   | 175: 12 (14.3%)    | (100.0%)  |
|            |               | IQR (CV) = 500 (0.68)               | 250: 12 (14.3%)    |           |
|            |               |                                     | 350: 12 (14.3%)    |           |
|            |               |                                     | 500: 12 (14.3%)    |           |
|            |               |                                     | 675: 12 (14.3%)    |           |
|            |               |                                     | 1000: 12 (14.3%)   |           |
+------------+---------------+-------------------------------------+--------------------+-----------+
| uptake     | type:double   | mean (sd) = 27.21 (10.81)           | 76 distinct values | 84/84     |
|            | class:numeric | min < med < max = 7.7 < 28.3 < 45.5 |                    | (100.0%)  |
|            |               | IQR (CV) = 19.23 (0.4)              |                    |           |
+------------+---------------+-------------------------------------+--------------------+-----------+

ÉDITER

Dans les versions plus récentes de summarytools , la freq()fonction (qui produit des tableaux de fréquences simples, plus pertinents par rapport à la question d'origine) accepte les trames de données ainsi que les variables uniques. Pour les tableaux croisés (ce que proc freq fait également), voir la ctable()fonction.

freq(CO2)

Fréquences

CO2 $ Usine

Type : Facteur ordonné

          Freq   % Valid    % Valid Cum   % Total    % Total Cum
    Qn1      7      8.33           8.33      8.33           8.33
    Qn2      7      8.33          16.67      8.33          16.67
    Qn3      7      8.33          25.00      8.33          25.00
    Qc1      7      8.33          33.33      8.33          33.33
    Qc3      7      8.33          41.67      8.33          41.67
    Qc2      7      8.33          50.00      8.33          50.00
    Mn3      7      8.33          58.33      8.33          58.33
    Mn2      7      8.33          66.67      8.33          66.67
    Mn1      7      8.33          75.00      8.33          75.00
    Mc2      7      8.33          83.33      8.33          83.33
    Mc3      7      8.33          91.67      8.33          91.67
    Mc1      7      8.33         100.00      8.33         100.00
   <NA>      0                               0.00         100.00
  Total     84    100.00         100.00    100.00         100.00
CO2 $ Type

Type : Facteur

                Freq   % Valid    % Valid Cum   % Total    % Total Cum
       Quebec     42     50.00          50.00     50.00          50.00
  Mississippi     42     50.00         100.00     50.00         100.00
         <NA>      0                               0.00         100.00
        Total     84    100.00         100.00    100.00         100.00
Traitement CO2 $

Type : Facteur

               Freq   % Valid    % Valid Cum   % Total    % Total Cum
  nonchilled     42     50.00          50.00     50.00          50.00
     chilled     42     50.00         100.00     50.00         100.00
        <NA>      0                               0.00         100.00
       Total     84    100.00         100.00    100.00         100.00

2

Merci pour toutes les suggestions à tous. J'ai fini par utiliser la table ou la fonction numSummary de Rcmdr plus appliquer:

apply(dataframe[,c('need_rbcs','need_platelets','need_ffp')],2,table) 

Cela fonctionne plutôt bien et n'est pas trop gênant. Cependant, je vais certainement essayer certaines de ces autres solutions!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.