many Contar valores únicos




distinct en r (9)

Digamos que tengo:

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

Ahora, quiero contar la cantidad 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 dé

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

pero como un one-liner más general :) Algo cercano (pero no del todo) como este:

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

Answer #1

Quizás la mesa 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

Answer #2

Para obtener un vector entero no dimensionado que contiene el recuento de valores únicos, use 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 necesita alimentar los recuentos de valores únicos en otra función, y es más corto y más idiomático que el t(as.data.frame(table(dummyData))[,2] publicado en un comentario a la respuesta de Chase Gracias a Ricardo Saporta que me señaló esto here .


Answer #3

Si tiene múltiples factores (= un marco de datos multidimensional), puede usar 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 llamar al método de cadena en los datos del marco de data .


Answer #4

También haría que los valores categóricos y llamar a summary() funcionarían.

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

Answer #5
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")

Answer #6

La función table () es una buena forma de hacerlo, como Chase sugirió. Si está analizando un conjunto de datos grande, una forma alternativa es usar la función .N en el paquete datatable.

Asegúrese de haber instalado el paquete de la tabla de datos

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]

Answer #7

Es un enfoque de una línea al usar aggregate .

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

  value count
1     1    25
2     2    75

Answer #8

Esto funciona para mí Toma tu vector v

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

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

o con el paquete magrittr

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


Answer #9

Si necesita tener el número de valores únicos como una columna adicional en el marco de datos que contiene sus valores (una columna que puede representar el tamaño de 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))






unique