2012-09-10 11 views
9

que tienen un vector que tiene este aspecto:En R, ¿cómo creo variables de factores agrupados de una variable continua, con saltos personalizados?

dataset<-c(4,7,9,1,10,15,18,19,3,16,10,16,12,22,2,23,16,17) 

me gustaría crear cuatro categorías ficticias, en el que el conjunto de datos bin continua por medio de pausas personalizados. .. por ejemplo: 1: 4, 5: 9, 10:17, 18:23.

Las categorías ficticias salida tendrían la misma longitud que el vector original continua (18 en este caso), pero ahora cada variable ficticia binned serían sólo contienen un 1 o un 0.

Respuesta

16

Uso cut:

data.frame(dataset, bin=cut(dataset, c(1,4,9,17,23), include.lowest=TRUE)) 
+1

Para llegar desde 'corte' al muerto las variables (que es lo que pidió el PO), trata de' model.matrix (~ bin-1, los datos = conjunto de datos) ' –

7

Estoy de acuerdo con Joshua en que cut es lo que mucha gente pensaría en esta tarea. No me gustan sus valores predeterminados, prefiero tener intervalos cerrados a la izquierda y es un dolor menor configurarlo correctamente con cut (aunque se puede hacer. Afortunadamente para mi cerebro débil, Frank Harrell ha diseñado una función cut2 en Su paquete Hmisc prefiero los valores predeterminados. Una tercera alternativa es usar findInterval, que es especialmente adecuado para problemas en los que desea utilizar el resultado como un índice para otras extracciones o procesos de selección. Sus resultados son más o menos lo que obtendría si aplicara as.numeric a los resultados de cut:

require(Hmisc) 
cut2(dataset, c(1,4,9,17,23)) 
[1] [ 4, 9) [ 4, 9) [ 9,17) [ 1, 4) [ 9,17) [ 9,17) [17,23] [17,23] [ 1, 4) [ 9,17) 
[11] [ 9,17) [ 9,17) [ 9,17) [17,23] [ 1, 4) [17,23] [ 9,17) [17,23] 

(Tenga en cuenta que findInterval utilizará el límite superior como el extremo cerrado para formar un intervalo extra a menos que cambie el máximo w ITH Inf, una palabra reservada para el infinito en R.)

findInterval(dataset, c(c(1,4,9,17,23))) 
[1] 2 2 3 1 3 3 4 4 1 3 3 3 3 4 1 5 3 4 
as.numeric(cut(dataset, c(1,4,9,17,Inf), include.lowest=TRUE)) 
[1] 1 2 2 1 3 3 4 4 1 3 3 3 3 4 1 4 3 3 
as.numeric(cut(dataset, c(1,4,9,17,23), include.lowest=TRUE)) 
[1] 1 2 2 1 3 3 4 4 1 3 3 3 3 4 1 4 3 3 
Cuestiones relacionadas