2011-05-06 17 views
13

Verilerimi eşit bölmelerde bölmek için kesim işlevini kullanıyorum, iş yapıyor ama değerleri döndürme biçiminden memnun değilim. İhtiyacım olan şey, üst ve alt uçları değil, çöp kutusunun merkezi.
Ayrıca, cut2{Hmisc} kullanmayı denedim, bu da her bir bidonun merkezini veriyor, ancak veriyi aynı uzunlukta olmak yerine aynı sayıda gözlemi içeren kutulara böler., eşit uzunluktaki kutularda bir değer aralığı ayırın: cut-cut2

Bunun için bir çözümü olan var mı?

cevap

10

Bu sonları yapmak için çok zor değil ve böyle bir şey ile kendinizi etiketler. Burada orta nokta tek bir sayı olduğundan, aslında etiketli bir faktörü değil, sayısal bir vektör döndürmüyorum.

cut2 <- function(x, breaks) { 
    r <- range(x) 
    b <- seq(r[1], r[2], length=2*breaks+1) 
    brk <- b[0:breaks*2+1] 
    mid <- b[1:breaks*2] 
    brk[1] <- brk[1]-0.01 
    k <- cut(x, breaks=brk, labels=FALSE) 
    mid[k] 
} 

Bin kırılma ve orta noktaları almak için muhtemelen daha iyi bir yol var; Bunu çok düşünmedim.

Bu cevabın Joshua'nınkinden farklı olduğunu unutmayın; her bidonun merkezini verirken her bir bölmedeki veriyi verir.

> head(cut2(x,3)) 
[1] 16.666667 3.333333 16.666667 3.333333 16.666667 16.666667 
> head(ave(x, cut(x,3), FUN=median)) 
[1] 18 2 18 2 18 18 
7

Kullanım ave şöyle:

set.seed(21) 
x <- sample(0:20, 100, replace=TRUE) 
xCenter <- ave(x, cut(x,3), FUN=median)