2010-10-22 15 views
8

Kümeleri temsil eden faktörleri atamak istiyorum. Böylece sayısal olmalarına ihtiyacım var.R 'de kuantum "mankenler"/faktörler yaratmak için daha iyi bir yolu var mı?

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) 

    } 

şimdi gülmek olabilir :): That's neden temelde sorunuma cevap aşağıdaki işlevi yazdı. Döndürülen liste, her gözlemi karşılık gelen kuantiline atamak için kullanılabilecek bir değişken içerir. Benim sorum şimdi: Bunu yapmak için daha iyi bir yol (daha "yerli" veya "çekirdek") var mı? Ben kuantcut (gtools paketinden) hakkında biliyorum, ama en azından aldığım parametreler ile, ben sadece elverişsiz (- en azından benim) eşikleri ile sona erdi.

Daha iyi olmanıza yardımcı olacak her türlü geri dönüş takdir edilir!

cevap

13

aşağıdaki, kullanım miktarlarını yapmak ve olacaktır:

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

yoksa sadece numara istiyorsanız:

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

Hadley, kabul edilen cevap oranıyla tuş vuruşlarını iyileştirmeye çalışıyor. –

3

ne olduğunu quantcut emin değilim ama Ayrık sayısal değişkeni dönüştürmek için kesilmiş sonra bölünmeler anlamaya baz Ar ile

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

güzel cevap. Temel olarak kuantcut, kuantcut ile tamamen aynıdır. Fark yaratan yardım, seviyeleri 1: q ile değiştirmekti. Bunun mümkün olduğunu bilmiyordum. Thx Sameer! –