2012-06-22 22 views
26

Sono nuovo con R. Ho bisogno di generare una tabella di frequenza semplice (come nei libri) con frequenza cumulativa e frequenza relativa.Come generare una tabella di frequenza in R con frequenza cumulativa e frequenza relativa

Quindi voglio generare da alcuni dati semplici come

> x 
[1] 17 17 17 17 17 17 17 17 16 16 16 16 16 18 18 18 10 12 17 17 17 17 17 17 17 17 16 16 16 16 16 18 18 18 10 
[36] 12 15 19 20 22 20 19 19 19 

una tabella come:

  frequency cumulative relative 
(9.99,11.7] 2   2  0.04545455 
(11.7,13.4] 2   4  0.04545455 
(13.4,15.1] 1   5  0.02272727 
(15.1,16.9] 10   15  0.22727273 
(16.9,18.6] 22   37  0.50000000 
(18.6,20.3] 6   43  0.13636364 
(20.3,22]  1   44  0.02272727 

So che dovrebbe essere semplice, ma non so come.

ho avuto alcuni risultati utilizzando questo codice:

factorx <- factor(cut(x, breaks=nclass.Sturges(x))) 
as.matrix(table(factorx)) 

risposta

24

sei vicino! Ci sono alcune funzioni che renderanno questo più facile per te, ovvero cumsum() e prop.table(). Ecco come probabilmente metterei questo insieme. Faccio alcuni dati casuali, ma il punto è lo stesso:

#Fake data 
x <- sample(10:20, 44, TRUE) 
#Your code 
factorx <- factor(cut(x, breaks=nclass.Sturges(x))) 
#Tabulate and turn into data.frame 
xout <- as.data.frame(table(factorx)) 
#Add cumFreq and proportions 
xout <- transform(xout, cumFreq = cumsum(Freq), relative = prop.table(Freq)) 
#----- 
     factorx Freq cumFreq relative 
1 (9.99,11.4] 11  11 0.25000000 
2 (11.4,12.9] 3  14 0.06818182 
3 (12.9,14.3] 11  25 0.25000000 
4 (14.3,15.7] 2  27 0.04545455 
5 (15.7,17.1] 6  33 0.13636364 
6 (17.1,18.6] 3  36 0.06818182 
7 (18.6,20] 8  44 0.18181818 
+1

anche dovrebbe dare una spina a '?? 'La funzione che consente la ricerca fuzzy, cioè la somma cumulativa' ?? "" ti guiderà nella giusta direzione. – Chase

+1

Ha funzionato bene, mi confondeva che la visualizzazione dei dati è fatta come ** frame dati ** (invece di una tabella). '' 'È davvero buono, ma non sono madrelingua inglese, quindi è difficile cercare aiuto. – eloyesp

+0

@El_Hoy - confronta l'output di 'str (as.data.frame (tabella (campione (1:10, 100, TRUE))))' e 'str (tabella (campione (1:10, 100, TRUE))) 'per vedere la differenza nell'output. Formattazione come dati.frame rende più semplice aggiungere cumsum e proporzioni. In bocca al lupo! Un sacco di buone informazioni qui su SO e un sacco di persone a cui piace rispondere alle domande. Saluti! – Chase

19

Le funzioni di base table, cumsum e prop.table dovrebbe arrivare lì:

cbind(Freq=table(x), Cumul=cumsum(table(x)), relative=prop.table(table(x))) 
    Freq Cumul relative 
10 2  2 0.04545455 
12 2  4 0.04545455 
15 1  5 0.02272727 
16 10 15 0.22727273 
17 16 31 0.36363636 
18 6 37 0.13636364 
19 4 41 0.09090909 
20 2 43 0.04545455 
22 1 44 0.02272727 

Con cbind e la denominazione delle colonne a proprio piacimento questo dovrebbe essere abbastanza facile per te in futuro. L'output della funzione tabella è una matrice, quindi questo risultato è anche una matrice. Se questo fosse stato fatto su qualcosa di grande sarebbe più efficace todo questo:

tbl <- table(x) 
cbind(Freq=tbl, Cumul=cumsum(tbl), relative=prop.table(tbl)) 
12

Se siete alla ricerca di qualcosa di pre-confezionato, si consideri la funzione freq() dal pacchetto descr.

library(descr) 
x = c(sample(10:20, 44, TRUE)) 
freq(x, plot = FALSE) 

O per ottenere percentuali cumulative, utilizzare la funzione

freq(ordered(x), plot = FALSE) 

ordered() Per aggiungere una colonna "frequenze cumulative":

tab = as.data.frame(freq(ordered(x), plot = FALSE)) 
CumFreq = cumsum(tab[-dim(tab)[1],]$Frequency) 
tab$CumFreq = c(CumFreq, NA) 
tab 

Se i dati sono valori mancanti, una percentuale valida colonna viene aggiunta alla tabella.

x = c(sample(10:20, 44, TRUE), NA, NA) 
freq(ordered(x), plot = FALSE) 
1

Ancora un'altra possibilità:

library(SciencesPo) 
    x = c(sample(10:20, 50, TRUE)) 
    freq(x) 
-1

Il mio suggerimento è quello di controllare il pacchetto agricolae ... check it out:

library(agricolae) 

weight<-c(68, 53, 69.5, 55, 71, 63, 76.5, 65.5, 69, 75, 76, 57, 70.5, 
+ 71.5, 56, 81.5, 69, 59, 67.5, 61, 68, 59.5, 56.5, 73, 
+ 61, 72.5, 71.5, 59.5, 74.5, 63) 

h1<- graph.freq(weight,col="yellow",frequency=1,las=2,xlab="h1") 

print(summary(h1),row.names=FALSE) 
Problemi correlati