2014-09-30 16 views
18

Ho un data.frame mydf con circa 2500 righe. Queste righe corrispondono a 69 classi di oggetti nella colonna 1 mydf$V1 e voglio contare quante righe per classe di oggetti ho. posso ottenere un fattore di queste classi con:Come contare quanti valori per livello in un dato fattore?

objectclasses = unique(factor(mydf$V1, exclude="1")); 

Qual è il modo R laconico di contare le righe per classe di oggetti? Se questo fosse un qualsiasi altro linguaggio avrei attraversato un array con un loop e mantenendo il conto ma sono nuovo alla programmazione R e sto cercando di sfruttare le operazioni vettorializzate di R.

+3

Hai provato un 'table'? Senza un esempio riproducibile è difficile indovinare la risposta –

+1

Possibile duplicato di http://stackoverflow.com/questions/4215154/count-unique-values-in-r/4215196#4215196 – Henrik

risposta

22

o utilizzando la libreria dplyr:

library(dplyr) 
set.seed(1) 
dat <- data.frame(ID = sample(letters,100,rep=TRUE)) 
dat %>% 
    group_by(ID) %>% 
    summarise(no_rows = length(ID)) 

Si noti l'uso di %>%, che è simile all'uso di tubi in bash. In effetti, il codice sopra i tubi da dat a group_by e il risultato di tale operazione sono inviati in summarise.

Il risultato è:

Source: local data frame [26 x 2] 

    ID no_rows 
1 a  2 
2 b  3 
3 c  3 
4 d  3 
5 e  2 
6 f  4 
7 g  6 
8 h  1 
9 i  6 
10 j  5 
11 k  6 
12 l  4 
13 m  7 
14 n  2 
15 o  2 
16 p  2 
17 q  5 
18 r  4 
19 s  5 
20 t  3 
21 u  8 
22 v  4 
23 w  5 
24 x  4 
25 y  3 
26 z  1 

Vedere la dplyr introduction per un po 'più contesto, e la documentazione per i dettagli delle singole funzioni.

+0

Questo è esattamente quello che volevo. La risposta al tavolo è anche utile; ci sono alcuni problemi con i dati che mi impediscono di usare un tavolo per il momento, quindi sto usando un data.frame per il momento. – Escher

+0

Sono nuovo di R, ma sembra che questo pacchetto di dplyr sia la jquery di R. È la risposta per molte cose. –

+1

Utilizzare 'table' invece sarebbe meglio, in quanto non richiede una libreria aggiuntiva. –

19

Qui 2 modi per farlo:

set.seed(1) 
tt <- sample(letters,100,rep=TRUE) 

## using table 
table(tt) 
tt 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 
## using tapply 
tapply(tt,tt,length) 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 
17

Utilizzando plyr pacchetto:

library(plyr) 

count(mydf$V1) 

lo restituirà una frequenza di ogni valore.

12

Utilizzando data.table

library(data.table) 
setDT(dat)[, .N, keyby=ID] #(Using @Paul Hiemstra's `dat`) 

o utilizzando dplyr 0.3

res <- count(dat, ID) 
head(res) 
#Source: local data frame [6 x 2] 

# ID n 
#1 a 2 
#2 b 3 
#3 c 3 
#4 d 3 
#5 e 2 
#6 f 4 

O

dat %>% 
     group_by(ID) %>% 
     tally() 

O

dat %>% 
     group_by(ID) %>% 
     summarise(n=n()) 
2

Possiamo usare summary sulla colonna di fattore:

summary(myDF$factorColumn) 
+0

'summary (ggplot2 :: diamanti $ chiarezza)' sembra eseguito come desiderato. – woodvi

Problemi correlati