Pregunta

Tengo una trama de datos con una columna de enteros que me gustaría utilizar como referencia para hacer una nueva variable categórica. Quiero dividir la variable en tres grupos y establecer los rangos de mí mismo (es decir, 0-5, 6-10, etc). Probé cut pero que divide la variable en grupos basados ??en una distribución normal y mis datos es sesgada a la derecha. También he tratado de usar si / entonces declaraciones pero esto salidas de un valor verdadero / falso y me gustaría mantener mi variable original. Estoy seguro de que hay una forma sencilla de hacer esto, pero me parece que no puede entenderlo. Cualquier consejo sobre una forma sencilla de hacer esto de manera rápida?

Yo tenía algo en mente la siguiente manera:

x   x.range
3   0-5
4   0-5
6   6-10
12  11-15
¿Fue útil?

Solución

La respuesta de Ian ( corte ) es la forma más común de hacer esto, por lo que sé.

Yo prefiero usar teja , del Entramado Paquete

el argumento que especifica los intervalos van a agrupar parece un poco más intuitivo para mí.

se utiliza teja , así:

# mock some data
data = sample(0:40, 200, replace=T)

a = c(0, 5);b = c(5,9);c = c(9, 19);d = c(19, 33);e = c(33, 41)

my_bins = matrix(rbind(a, b, c, d, e), ncol=2)

# returns: (the binning intervals i've set)
        [,1] [,2]
 [1,]    0    5
 [2,]    5    9
 [3,]    9   19
 [4,]   19   33
 [5,]   33   41

shx = shingle(data, intervals=my_bins)

#'shx' at the interactive prompt will give you a nice frequency table:
# Intervals:
   min max count
1   0   5    23
2   5   9    17
3   9  19    56
4  19  33    76
5  33  41    46

Otros consejos

x <- rnorm(100,10,10)
cut(x,c(-Inf,0,5,6,10,Inf))

puede utilizar smart_cut de cutr paquete:

devtools::install_github("moodymudskipper/cutr")
library(cutr)

x <- c(3,4,6,12)

Para cortar con intervalos de longitud 5, comenzando en 1:

smart_cut(x,list(5,1),"width" , simplify=FALSE)
# [1] [1,6)   [1,6)   [6,11)  [11,16]
# Levels: [1,6) < [6,11) < [11,16]

Para obtener exactamente la salida solicitada:

smart_cut(x,c(0,6,11,16), labels = ~paste0(.y[1],'-',.y[2]-1), simplify=FALSE, open_end = TRUE)
# [1]   0-5   0-5  6-10 11-15
# Levels:   0-5 <  6-10 < 11-15

más en cutr y smart_cut

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top