2010-03-24 9 views
10

Tengo un vector X que contiene números positivos que quiero bin/discretizar. Para este vector, quiero que los números [0, 10) aparezcan tal como existen en el vector, pero los números [10, ∞] son ​​10+.Intercalando una variable numérica en R

que estoy usando:

x <- c(0,1,3,4,2,4,2,5,43,432,34,2,34,2,342,3,4,2) 
binned.x <- as.factor(ifelse(x > 10,"10+",x)) 

pero esto se siente klugey a mí. ¿Alguien sabe una mejor solución o un enfoque diferente?

+1

¿Qué es kludgy sobre eso? Me parece bastante limpio. –

+2

@Rob: El principal inconveniente de este enfoque es que no se crean niveles de factor para los valores que no están allí (por ejemplo, para estos datos no existe el nivel "6"). Esto podría solucionarse con niveles explícitos en la llamada a 'factor'. –

Respuesta

17

¿Qué tal cut:

binned.x=cut(x, breaks=c(-1:9,Inf), labels=c(as.character(0:9),'10+')) 

que produce:

[1] 0 1 3 4 2 4 2 5 10+ 10+ 10+ 2 10+ 2 10+ 3 4 2 
Levels: 0 1 2 3 4 5 6 7 8 9 10+ 
+1

Eso parece más complicado que la solución en la pregunta. –

+1

Mejoras menores: intercambie '1e6' con' Inf'. No necesita 'include.lowest = TRUE'. (Compare las respuestas llamando 'table (binned.x)'. –

+0

@Rob: Sí, no puedo decir que estoy en desacuerdo :) @Richie: ¡Gracias! Todavía estoy aprendiendo el idioma, por lo que tus "pequeñas mejoras" son una gran ayuda para mí. – unutbu

7

Usted pregunta es inconsistente.
En la descripción 10 pertenece al grupo "10+", pero en el código 10 es nivel separado. Si 10debe estar en el "10+" grupo, entonces el código debe ser

as.factor(ifelse(x >= 10,"10+",x)) 

En este caso se podría truncar los datos a 10 (si no desea que un factor):

pmin(x, 10) 
# [1] 0 1 3 4 2 4 2 5 10 10 10 2 10 2 10 3 4 2 10 
2
x[x>=10]<-"10+" 

Esto le dará un vector de cadenas. Puede usar as.numeric(x) para convertir de nuevo a números ("10+" se convierte en NA), o as.factor(x) para obtener su resultado anterior.

Tenga en cuenta que esto modificará el vector original en sí, por lo que es posible que desee copiar a otro vector y trabajar en eso.

Cuestiones relacionadas