2010-11-18 17 views
87

Digamos que tengo:Count valores únicos

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

Ahora, quiero contar el número de veces que aparece cada valor único. unique(v) devuelve cuáles son los valores únicos, pero no cuántos son.

> unique(v) 
[1] 1 2 

Quiero algo que me da

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

sino como una sola línea más general :) Algo cerca (pero no del todo) como esto:

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

No, pero busqué en Google "Count valores únicos en I" encontrado nada útil y ahora esta página es el número 4 en mis resultados, y se espera ayude a los demás, así, sin apenas diciéndoles que leer un libro para encontrar esta una respuesta. – gakera

+7

Bueno, la respuesta a continuación me ayudó y me ahorró tiempo. Supongo que Chase no tardó mucho tiempo en armar la respuesta, pero si malgastaba su tiempo lo siento. Estoy de acuerdo en que esta discusión es una pérdida de tiempo, sin embargo. Este es un sitio web de preguntas y respuestas, no encontré esta respuesta y ahora está aquí, ¿cómo es que algo de esto está mal? No pierdas tu tiempo mirando cosas que ya sabes, ¿cómo es eso? – gakera

+2

@garkera - Aquí hay una buena lista o recursos http://stats.stackexchange.com/questions/138/resources-for-learning-r – Chase

Respuesta

121

Quizás tabla es lo que buscas?

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í, puedo usar esto, con algunas pequeñas modificaciones: t (como.data.frame (tabla (v)) [, 2]) es exactamente lo que necesito, gracias – gakera

+1

Solía ​​hacer esto torpemente con ' hist'. 'table' parece un poco más lento que' hist'. Me pregunto porque. ¿Alguien puede confirmar? – Museful

+1

Chase, ¿alguna posibilidad de ordenar por frecuencia? Tengo exactamente el mismo problema, pero mi tabla tiene aproximadamente 20000 entradas y me gustaría saber qué tan frecuentes son las entradas más comunes. – Torvon

6

Para obtener un vector de enteros no-dimensionado que contiene el recuento de valores únicos, utilizar 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" 

Esto puede ser útil si usted necesita para alimentar las cuentas de valores únicos en otra función, y es más corto y más idiomática que el t(as.data.frame(table(dummyData))[,2] publicado en un comentario a la respuesta del Chase. Gracias a Ricardo Saporta que me lo señaló here.

3

Si es necesario tener el número de valores únicos como una columna adicional en la trama de datos que contiene los valores (una columna que puede representar tamaño de la muestra, por ejemplo), plyr proporciona una manera ordenada:

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)'. También vale la pena hacer explícito que se necesita una llamada 'library (" plyr ")' para hacer que 'ddply' funcione. –

+0

Parece extraño usar 'transform' en lugar de' mutate' cuando se 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

Esta es una solución bastante detallada cuando podrías usar 'tabla' ... –

0

Si desea ejecutar único en un hoja.de.datos (por ejemplo, train.data), y también obtener las cuentas (que se pueden utilizar como el peso en clasificadores), puede hacer lo siguiente:

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

Es una aproximación de una línea ch usando aggregate. función

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

    value count 
1  1 25 
2  2 75 
5

tabla() es una buena manera de ir, como Chase sugeridos. Si está analizando un conjunto de datos grande, una forma alternativa es usar la función .N en el paquete datatable.

Asegúrese de que ha instalado el paquete tabla de datos por

install.packages("data.table") 

Código:

# 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

Si tiene varios factores (= una trama de datos multidimensional), puede utilizar el paquete dplyr para contar valores únicos en cada combinación de factores:

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

Utiliza el operador de tubería %>% para encadenar llamadas de método en el marco de datos data.

0

Esto funciona para mí.Tome su vector v

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

Comentario: establecer maxsum que ser lo suficientemente grande como para capturar el número de valores únicos

o con el magrittr paquete

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

1

hacer también los valores categórico y llamar summary() funcionaría.

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