Gibt es ein R-Äquivalent zu SAS PROC FREQ?


18

Kennt jemand ein R-Äquivalent zu SAS PROC FREQ?

Ich versuche, zusammenfassende beschreibende Statistiken für mehrere Variablen gleichzeitig zu generieren.


2
Warum wurde diese Frage geschlossen? Es bezieht sich auf die Datenvisualisierung und hat mehrere wertvolle Antworten generiert.
z0lo

Antworten:



9

Das Zusammenfassen von Daten in Base R bereitet nur Kopfzerbrechen. Dies ist einer der Bereiche, in denen SAS recht gut funktioniert. Für R empfehle ich das plyrPaket.

In 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;

mit plyr:

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

8

Ich benutze kein SAS. SAS PROC FREQDaher kann ich nicht kommentieren, ob das folgende Replikat vorhanden ist , aber dies sind zwei schnelle Strategien zum Beschreiben von Variablen in einem data.frame, die ich häufig verwende:

  • describein Hmiscbietet eine nützliche Zusammenfassung von Variablen, einschließlich numerischer und nicht numerischer Daten
  • describein psychbietet beschreibende Statistiken für numerische Daten

R Beispiel

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

Folgendes ist die Ausgabe von 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]

Nachfolgend sehen Sie die Ausgabe psych describefür die numerischen Variablen:

> 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

Ich verwende die Codebuchfunktion von {EPICALC}, die zusammenfassende Statistiken für eine numerische Variable und eine Häufigkeitstabelle mit Ebenenbezeichnungen und Codes für Faktoren enthält. http://cran.r-project.org/doc/contrib/Epicalc_Book.pdf (siehe S.50) Darüber hinaus ist dies sehr nützlich, da es SD für quantitative Variablen bereitstellt.

Genießen !

Beispielausgabe


1
+1 (von früher). Ich mag die Art und Weise, wie das dargestellt codebook()wird. Ein Problem ist, dass nas gelöscht werden, was Sie möglicherweise in Ihre Ausgabe aufnehmen möchten. Eine Möglichkeit, mit diesem Problem umzugehen (zumindest mit Faktoren), besteht darin ,? Recode.is.na 1st zu verwenden (z. B. "missing"). Für numerische Variablen können Sie unmittelbar links von der Spalte eine neue Variable mit einem darauf basierenden logischen Wert erstellen is.na()und dann ausführen codebook(). Es ist allerdings ein bisschen kluge.
gung - Wiedereinsetzung von Monica

3

Sie können sich mein Summarytools- Paket ( CRAN-Link ) ansehen , das eine Codebuch-ähnliche Funktion mit Markdown- und HTML-Formatierungsoptionen enthält.

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

Dataframe-Zusammenfassung

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)              |                    |           |
+------------+---------------+-------------------------------------+--------------------+-----------+

BEARBEITEN

In neueren Versionen von Summarytools akzeptiert die freq()Funktion (die einfache Häufigkeitstabellen erstellt, die in Bezug auf die ursprüngliche Frage auf den Punkt gebracht werden) sowohl Datenrahmen als auch einzelne Variablen. Für Kreuztabellen (was auch proc freq tut), siehe die ctable()Funktion.

freq(CO2)

Frequenzen

CO2 $ Anlage

Typ : Bestellfaktor

          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 $ Typ

Typ : Faktor

                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
CO2 $ Behandlung

Typ : Faktor

               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

Vielen Dank für all die Vorschläge an alle. Am Ende habe ich entweder Tabelle oder Rcmdrs numSummary-Funktion verwendet und Folgendes angewendet:

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

Das funktioniert ganz gut und ist nicht zu umständlich. Allerdings werde ich auf jeden Fall einige dieser anderen Lösungen ausprobieren!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.