2010-10-22 11 views
8

Mi piacerebbe assegnare i fattori che rappresentano i quantili. Quindi ho bisogno che siano numerici. Ecco perché ho scritto la seguente funzione, che è sostanzialmente la risposta al mio problema:C'è un modo migliore per creare "dummies" quantici/fattori in 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) 

    } 

si può ridere ora :). L'elenco restituito contiene una variabile che può essere utilizzata per assegnare ogni osservazione al suo quantile corrispondente. La mia domanda è ora: c'è un modo migliore (più "nativo" o "core") per farlo? So di quantcut (dal pacchetto gtools), ma almeno con i parametri che ho ottenuto, ho finito solo con quelle soglie immutabili (? Almeno per me).

Qualsiasi feedback che aiuti a migliorare è apprezzato!

risposta

13

Con base R, uso quantili per capire le spaccature e poi tagliato per convertire la variabile numerica al discreto:

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

o se si desidera solo il numero:

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

Sembra che Hadley stia cercando di migliorare le sue battute per rapporto di risposta accettato ... –

3

non sono sicuro che cosa è quantcut ma sarebbe fare le seguenti

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

bella risposta. Fondamentalmente quantcut fa esattamente lo stesso di quantcut. La differenza di aiuto è stata quella di sostituire i livelli di 1: q. Non sapevo che fosse possibile. Thx Sameer! –