2010-10-22 5 views
8

Ich möchte Faktoren zuweisen, die Quantile darstellen. Daher brauche ich sie numerisch. Darum schrieb ich die folgende Funktion, die im Grunde die Antwort auf mein Problem ist:Gibt es eine bessere Möglichkeit, Quantil "Dummies"/Faktoren in R zu erstellen?

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) 

    } 

Sie können jetzt lachen :). Die zurückgegebene Liste enthält eine Variable, mit der jede Beobachtung dem entsprechenden Quantil zugewiesen werden kann. Meine Frage ist jetzt: Gibt es einen besseren Weg ("nativer" oder "Kern"), es zu tun? Ich kenne quantcut (aus dem gtools-Paket), aber zumindest mit den Parametern, die ich bekam, endete ich nur mit diesen unhandlichen (? - zumindest für mich) Schwellenwerten.

Jede Rückmeldung, die hilft, besser zu werden, wird geschätzt!

Antwort

13

Mit Base R, Verwendung quantiles tun die Spalten, um herauszufinden, und dann schneiden die numerische Variable umwandeln auf diskrete:

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

oder wenn Sie wollen einfach nur die Nummer:

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

Sieht so aus, als ob Hadley versucht, seine Tastaturanschläge pro akzeptiertem Antwortverhältnis zu verbessern ... –

3

Ich bin mir nicht sicher, was quantcut ist, aber ich würde die folgenden

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

nette Antwort. Grundsätzlich funktioniert quantcut genauso wie quantcut. Der Unterschied bestand darin, die Ebenen durch 1: q zu ersetzen. Ich wusste nicht, dass das möglich ist. Thx Sameer! –

Verwandte Themen