2010-10-22 11 views
8

me gustaría asignar factores que representen cuantiles. Por lo tanto, necesito que sean numéricos. Por eso escribí la siguiente función, que es básicamente la respuesta a mi problema:¿Existe una mejor manera de crear "maniquíes"/factores cuantílicos en R?

qdum <- function(v,q){ 

qd = quantile(v,1:(q)/q) 
v = as.data.frame(v) 
v$b = 0 
names(v) <- c("a","b") 
i=1 
for (i in 1:q){ 

    if(i == 1) 
     v$b[ v$a < qd[1]] = 1 
    else 
     v$b[v$a > qd[i-1] & v$a <= qd[i]] = i 
} 

all = list(qd,v) 
return(all) 

    } 

puede reír ahora :). La lista devuelta contiene una variable que se puede usar para asignar cada observación a su cuantil correspondiente. Mi pregunta es ahora: ¿hay una forma mejor (más "nativa" o "básica") para hacerlo? Sé de quantcut (del paquete gtools), pero al menos con los parámetros que obtuve, terminé solo con esos umbrales descuidados (? Al menos para mí).

¡Se agradece cualquier comentario que ayude a mejorar!

Respuesta

13

Con la base R, cuantiles uso de averiguar las divisiones y luego se corta para convertir la variable numérica a Discreto:

qcut <- function(x, n) { 
    cut(x, quantile(x, seq(0, 1, length = n + 1)), labels = seq_len(n), 
    include.lowest = TRUE) 
} 

o si lo que desea es el número:

qcut2 <- function(x, n) { 
    findInterval(x, quantile(x, seq(0, 1, length = n + 1)), all.inside = T) 
} 
+0

Parece que Hadley está tratando de mejorar sus pulsaciones de teclas según la proporción de respuestas aceptadas ... –

3

no estoy seguro de lo que es quantcut pero me gustaría hacer las siguientes

qdum <- function(v, q) { 
library(Hmisc) 
quantilenum <- cut2(v, g=q) 
levels(quantilenum) <- 1:q 
cbind(v, quantilenum) 
} 
+0

buena respuesta. Básicamente, Quantcut hace exactamente lo mismo que Quantcut. La diferencia que hizo la ayuda fue reemplazar los niveles por 1: q. No sabía que esto fuera posible. ¡Thx Sameer! –

Cuestiones relacionadas