values studio sort repeated remove duplicated r unique na r-factor

studio - Los valores únicos de la columna de factor que contienen NA=> "La tabla de hash está llena" error



sort() r (4)

¿Podrías usar dplyr y obtener un resultado diferente? Por ejemplo, configuro algunos datos falsos (pequeños) y luego determino los distintos niveles de alpha . Aunque no sé qué tan bien esta escala.

test <- data.frame(alpha=sample(c(''a'', ''b'', ''c''), 100000, replace=TRUE), num=runif(100000)) uniqueAlpha <- distinct(select(test, alpha))

Tengo una tabla de datos con 57 m de registros y 9 columnas, una de las cuales está causando problemas cuando intento ejecutar algunas estadísticas de resumen. La columna ofensiva es un factor con 3699 niveles y recibo un error de la siguiente línea de código:

> unique(da$UPC) Error in unique.default(da$UPC): hash table is full

Ahora, obviamente, solo usaría: levels(da$UPC) pero estoy tratando de contar los valores únicos que existen en cada grupo como parte de múltiples parámetros / caluclations j en una declaración de grupo data.table.

Interesantemente unique(da$UPC[1:1000000]) funciona como se esperaba, pero unique(da$UPC[1:10000000]) no funciona. Dado que mi tabla tiene 57 millones de registros, esto es un problema.

Intenté convertir el factor en un personaje y no funciona de la siguiente manera:

da$UPC = as.character(levels(da$UPC))[da$UPC] unique(da$UPC)

Hacer esto me muestra un "nivel" adicional que es NA . Entonces, debido a que mis datos tienen algunos NA en una columna de factores, la función única no funciona. Me pregunto si esto es algo de lo que los desarrolladores están conscientes de algo que necesita ser arreglado. Encontré el siguiente artículo en r-devel que podría ser relevante pero no estoy seguro y no menciona data.table .

Artículo vinculado: único (1: 3, nmax = 1) congela R !

sessionInfo: R version 3.0.1 (2013-05-16) Platform: x86_64-unknown-linux-gnu (64-bit) locale: [1] LC_CTYPE=C LC_NUMERIC=C [3] LC_TIME=en_US.iso88591 LC_COLLATE=C [5] LC_MONETARY=en_US.iso88591 LC_MESSAGES=en_US.iso88591 [7] LC_PAPER=C LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.iso88591 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] plyr_1.8 data.table_1.8.8


Este fragmento de código debe colocar sus observaciones faltantes en un nivel regular que será más manejable para trabajar.

# Need additional level to place missing into first levels(da$UPC) <- c(levels(da$UPC), ''(NA)'') da$UPC[is.na(da$UPC)] <- ''(NA)''

Parece que en última instancia, está intentando bajar niveles poco frecuentes para ayudar en algún tipo de análisis. Escribí una función factorize () que creo que puede ayudarte. Coloca niveles infrecuentes en una categoría "Otros".

Aquí está el enlace, por favor hágamelo saber si ayuda.

[factorize ()] [1] https://github.com/greenpat/R-Convenience/blob/master/factorize.R

(reproducido abajo)

# This function takes a vector x and returns a factor representation of the same vector. # The key advantage of factorize is that you can assign levels for infrequent categories, # as well as empty and NA values. This makes it much easier to perform # multidimensional/thematic analysis on your largest population subsets. factorize <- function( x, # vector to be transformed min_freq = .01, # all levels < this % of records will be bucketed min_n = 1, # all levels < this # of records will be bucketed NA_level = ''(missing)'', # level created for NA values blank_level = ''(blank)'', # level created for "" values infrequent_level = ''Other'', # level created for bucketing rare values infrequent_can_include_blank_and_NA = F, # default NA and blank are not bucketed order = T, # default to ordered reverse_order = F # default to increasing order ) { if (class(x) != ''factor''){ x <- as.factor(x) } # suspect this is faster than reassigning new factor object levels(x) <- c(levels(x), NA_level, infrequent_level, blank_level) # Swap out the NA and blank categories x[is.na(x)] <- NA_level x[x == ''''] <- blank_level # Going to use this table to reorder f_tb <- table(x, useNA = ''always'') # Which levels will be bucketed? infreq_set <- c( names(f_tb[f_tb < min_n]), names(f_tb[(f_tb/sum(f_tb)) < min_freq]) ) # If NA and/or blank were infrequent levels above, this prevents bucketing if(!infrequent_can_include_blank_and_NA){ infreq_set <- infreq_set[!infreq_set %in% c(NA_level, blank_level)] } # Relabel all the infrequent choices x[x %in% infreq_set] <- infrequent_level # Return the reordered factor reorder(droplevels(x), rep(1-(2*reverse_order),length(x)), FUN = sum, order = order) }


No estoy seguro de que resolverá el problema, pero puedes revisar el paquete de forcats Hadley Wickham:

library(forcats) fct_count(da$UPC)


Tal vez me falte el punto, pero si es un objeto data.table, puedes usar esto para resumir los conteos:

da[,.N, by=UPC]

Si funciona, los valores únicos serían:

unique <- da[,.N, by=UPC]$UPC length(unique)

También puedes agrupar por múltiples columnas:

da[,.N,by=.(A,B,C,..)]