Есть ли лучший способ создать квантильные «чайники» / факторы в R?

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

  •  10-10-2019
  •  | 
  •  

Вопрос

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

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), но, по крайней мере, с параметрами, которые я получил, я закончил только с теми невыполненными (? - по крайней мере для меня) порогами.

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

Это было полезно?

Решение

С базой 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)
}

Другие советы

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

qdum <- function(v, q) {
 library(Hmisc)
 quantilenum <- cut2(v, g=q)
 levels(quantilenum) <- 1:q
 cbind(v, quantilenum)
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top