разделите диапазон значений в ячейках одинаковой длины: вырезать против вырезать2 - PullRequest
13 голосов
/ 06 мая 2011

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

У кого-нибудь есть решение этого вопроса?

Ответы [ 3 ]

10 голосов
/ 07 мая 2011

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

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

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

Обратите внимание, что этот ответ отличается от ответа Джошуа;Его дает медиану данных в каждом бине, в то время как это дает центр каждого бина.

> 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 голосов
/ 06 мая 2011

Использовать ave примерно так:

set.seed(21)
x <- sample(0:20, 100, replace=TRUE)
xCenter <- ave(x, cut(x,3), FUN=median)
0 голосов
/ 06 октября 2018

Мы можем использовать smart_cut из пакета cutr:

devtools::install_github("moodymudskipper/cutr")
library(cutr)

Используя выборочные данные @ Joshua:

медиана по интервалу (тот же вывод, что и у @Joshua, за исключением того, что это упорядоченный коэффициент):

smart_cut(x,3, "n_intervals", labels= ~ median(.))
# [1] 18 2  18 2  18 18 ...
# Levels: 2 < 11 < 18

центр каждого интервала (тот же вывод, что и у @Aaron, за исключением того, что это упорядоченный коэффициент):

smart_cut(x,3, "n_intervals", labels= ~ mean(.y))
# [1] 16.67 3.333 16.67 3.333 16.67 16.67 ...
# Levels: 3.333 < 10 < 16.67

среднее значение по интервалу:

smart_cut(x,3, "n_intervals", labels= ~ mean(.))
# [1] 17.48 2.571 17.48 2.571 17.48 17.48 ...
# Levels: 2.571 < 11.06 < 17.48

labels может быть символьным вектором, как и в base::cut.default, но он также может быть, как и здесь, функцией от 2 параметров, первый из которых представляет собой значения, содержащиеся в ячейке, а второй - точки вырезания.из корзины.

больше на cutr и smart_cut

...