Gibt es eine bessere Art und Weise Quantil „Dummies“ / Faktoren in R zu schaffen?

StackOverflow https://stackoverflow.com/questions/3998469

  •  10-10-2019
  •  | 
  •  

Frage

Id wie zu assign Faktoren darstellen quantiles. So muss ich sie numerisch sein. Darum schrieb ich die folgende Funktion, die im Grunde die Antwort auf mein Problem ist:

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, die verwendet werden können, jede Beobachtung zu seinem entsprechenden Quantil zuzuweisen. Meine Frage ist nun: Gibt es eine bessere Art und Weise (mehr „native“ oder „Kern“), es zu tun? Ich weiß, über quantcut (aus dem gtools Paket), aber zumindest mit den Parametern Ich habe, ich am Ende mit nur mit denen unhandlich (- zumindest für mich) Schwellen.

Jedes Feedback, das ist besser zu erhalten hilft sehr geschätzt wird!

War es hilfreich?

Lösung

Mit Base R, Verwendung quantiles, um herauszufinden, den Spagat und dann schneiden die numerische Variable auf diskrete zu konvertieren:

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)
}

Andere Tipps

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

tun
qdum <- function(v, q) {
 library(Hmisc)
 quantilenum <- cut2(v, g=q)
 levels(quantilenum) <- 1:q
 cbind(v, quantilenum)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top