Разделите диапазон значений в бункерах равной длины: разрез vs cut2

Я использую функцию разреза, чтобы разделить мои данные в равных ячейках, это делает работу, но я не доволен тем, как она возвращает значения. Мне нужен центр бункера, а не верхний и нижний. Я также пытался использовать cut2{Hmisc}, это дает мне центр каждого бункера, но он делит диапазон данных в бункерах, которые содержат одинаковое количество наблюдений, а не быть одинаковой длины.

Есть ли у кого-нибудь решение?

Ответ 1

Не слишком сложно сделать перерывы и ярлыки самостоятельно, с чем-то вроде этого. Здесь, поскольку средняя точка - это единственное число, я фактически не возвращаю фактор с метками, а вместо этого числовым вектором.

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

Вероятно, лучший способ получить разрывы бункеров и средние точки; Я не думал об этом очень тяжело.

Обратите внимание, что этот ответ отличается от Joshua's; он дает медиану данных в каждой ячейке, тогда как это дает центр каждой ячейки.

> 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

Ответ 2

Используйте ave следующим образом:

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