2010-11-18 16 views
87

Diciamo che ho:Count valori unici

v = rep(c(1,2, 2, 2), 25) 

Ora, voglio contare il numero di volte che ogni valore univoco. unique(v) restituisce i valori univoci, ma non quanti sono.

> unique(v) 
[1] 1 2 

voglio qualcosa che mi dà

length(v[v==1]) 
[1] 25 
length(v[v==2]) 
[1] 75 

ma come un più generale one-liner :) qualcosa di simile (ma non del tutto) in questo modo:

#<doesn't work right> length(v[v==unique(v)]) 
+9

No, ma ho cercato su google "Conta valori unici in R" trovato nulla utile ed ora questa pagina è il numero 4 nei miei risultati, e si spera aiutare gli altri pure, senza giustificato dicendo loro di leggere un libro per trovare questa unica risposta – gakera

+7

Beh, la risposta qui sotto mi ha aiutato e mi ha fatto risparmiare tempo. Presumo che Chase non abbia passato molto tempo a raccogliere la risposta, ma se ho perso tempo mi dispiace. Sono d'accordo che questa discussione è una perdita di tempo, tuttavia. Questo è un sito web di domande e risposte, non ho trovato questa risposta e ora è qui, com'è che c'è di tutto questo? Non perdere tempo guardando cose che già conosci, come vanno? – gakera

+2

@garkera - Ecco una buona lista o risorse http://stats.stackexchange.com/questions/138/resources-for-learning-r – Chase

risposta

121

Forse tavolo è cosa stai cercando?

dummyData = rep(c(1,2, 2, 2), 25) 

table(dummyData) 
# dummyData 
# 1 2 
# 25 75 

## or another presentation of the same data 
as.data.frame(table(dummyData)) 
# dummyData Freq 
# 1   1 25 
# 2   2 75 
+5

Ah, sì, posso usare questo, con qualche leggera modifica: t (as.data.frame (table (v)) [, 2]) è esattamente ciò di cui ho bisogno, grazie – gakera

+1

Ho usato per fare questo goffamente con ' hist'. 'table' sembra un po 'più lento di' hist'. Mi chiedo perché. Qualcuno può confermare? – Museful

+1

Chase, c'è qualche possibilità di ordinare per frequenza? Ho lo stesso identico problema, ma la mia tabella ha circa 20000 voci e mi piacerebbe sapere quanto sono frequenti le voci più comuni. – Torvon

6

Per ottenere un intero vettore non-dimensionato che contiene il conteggio di valori univoci, utilizzare c().

dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data 
c(table(dummyData)) # get un-dimensioned integer vector 
1 2 
25 75 

str(c(table(dummyData))) # confirm structure 
Named int [1:2] 25 75 
- attr(*, "names")= chr [1:2] "1" "2" 

Questo può essere utile se è necessario per alimentare i conti di valori unici in un'altra funzione, ed è più breve e più idiomatica del t(as.data.frame(table(dummyData))[,2] scritto in un commento alla risposta di Chase. Grazie a Ricardo Saporta che me lo ha fatto notare here.

3

Se avete bisogno di avere il numero di valori unici come una colonna aggiuntiva nella cornice di dati contenente i valori (una colonna che può rappresentare la dimensione del campione, ad esempio), plyr fornisce un modo pulito:

data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25)) 

library("plyr") 
data_frame <- ddply(data_frame, .(v), transform, n = length(v)) 
+3

o 'ddply (data_frame,. (V), count)'. Vale anche la pena di rendere esplicito che è necessario un 'library (" plyr ")' call per fare il lavoro 'ddply'. –

+0

Sembra strano usare 'transform' invece di' mutate' quando si usa 'plyr'. – Gregor

-2
count_unique_words <-function(wlist) { 
ucountlist = list() 
unamelist = c() 
for (i in wlist) 
{ 
if (is.element(i, unamelist)) 
    ucountlist[[i]] <- ucountlist[[i]] +1 
else 
    { 
    listlen <- length(ucountlist) 
    ucountlist[[i]] <- 1 
    unamelist <- c(unamelist, i) 
    } 
} 
ucountlist 
} 

expt_counts <- count_unique_words(population) 
for(i in names(expt_counts)) 
    cat(i, expt_counts[[i]], "\n") 
+2

Questa è una soluzione piuttosto prolissa quando si potrebbe facilmente usare 'table' ... –

0

Se si desidera eseguire unica su una data.frame (ad esempio, train.data), e anche ottenere i conteggi (che può essere utilizzato come il peso in classificatori), è possibile effettuare le seguenti operazioni:

unique.count = function(train.data, all.numeric=FALSE) {                                                 
    # first convert each row in the data.frame to a string                                            
    train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))                                       
    # use table to index and count the strings                                               
    train.data.str.t = table(train.data.str)                                                
    # get the unique data string from the row.names                                              
    train.data.str.uniq = row.names(train.data.str.t)                                             
    weight = as.numeric(train.data.str.t)                                                
    # convert the unique data string to data.frame 
    if (all.numeric) { 
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
     function(x) as.numeric(unlist(strsplit(x, split=","))))))                          
    } else { 
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
     function(x) unlist(strsplit(x, split=",")))))                          
    } 
    names(train.data.uniq) = names(train.data)                                               
    list(data=train.data.uniq, weight=weight)                                               
} 
11

È un'approvazione su una sola riga ch utilizzando aggregate. Funzione

> aggregate(data.frame(count = v), list(value = v), length) 

    value count 
1  1 25 
2  2 75 
5

tavolo() è un buon modo per andare, come Chase suggerito. Se si sta analizzando un set di dati di grandi dimensioni, un modo alternativo è utilizzare la funzione .N nel pacchetto datatable.

Assicurarsi è stato installato il pacchetto di tabella di dati da

install.packages("data.table") 

Codice:

# Import the data.table package 
library(data.table) 

# Generate a data table object, which draws a number 10^7 times 
# from 1 to 10 with replacement 
DT<-data.table(x=sample(1:10,1E7,TRUE)) 

# Count Frequency of each factor level 
DT[,.N,by=x] 
8

Se si dispone di più fattori (= un frame di dati multi-dimensionale), è possibile utilizzare il pacchetto dplyr per contare valori unici in ciascuna combinazione di fattori:

library("dplyr") 
data %>% group_by(factor1, factor2) %>% summarize(count=n()) 

Utilizza l'operatore di condotte %>% per chiamare il metodo a catena sul frame dati data.

0

Questo funziona per me.Prendete il vostro vettore v

length(summary(as.factor(v),maxsum=50000))

Commento: impostare maxsum essere grande abbastanza per catturare il numero di valori univoci

o con l'magrittr pacchetto

v %>% as.factor %>% summary(maxsum=50000) %>% length

1

Anche facendo i valori categorico e chiamando summary() funzionerebbe.

> v = rep(as.factor(c(1,2, 2, 2)), 25) 
> summary(v) 
1 2 
25 75 
Problemi correlati