Есть ли лучший способ создать квантильные "манекены" / факторы в R? - PullRequest
8 голосов
/ 22 октября 2010

Я хотел бы назначить факторы, представляющие квантили.Поэтому мне нужно, чтобы они были числовыми.Вот почему я написал следующую функцию, которая в основном является ответом на мою проблему:

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)

    }

Вы можете смеяться сейчас :).Возвращенный список содержит переменную, которую можно использовать для назначения каждого наблюдения соответствующему квантилю.Мой вопрос сейчас: есть ли лучший способ (более "родной" или "основной") сделать это?Я знаю о quantcut (из пакета gtools), но, по крайней мере, с параметрами, которые я получил, я получил только те неудобные (? - по крайней мере для меня) пороги.

Любые отзывы, которые помогают стать лучше, приветствуются!

Ответы [ 2 ]

13 голосов
/ 23 октября 2010

С основанием R используйте квантили, чтобы вычислить разбиения, а затем обрежьте, чтобы преобразовать числовую переменную в дискретную:

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

или, если вам нужно просто число:

qcut2 <- function(x, n) {
  findInterval(x, quantile(x, seq(0, 1, length = n + 1)), all.inside = T)
}
3 голосов
/ 22 октября 2010

Я не уверен, что такое Quantcut, но я бы сделал следующее

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