在相等长度的区间中划分一系列值:cut vs cut2

时间:2011-05-06 19:06:41

标签: r hmisc

我正在使用cut函数将我的数据拆分为相同的bin,它可以完成工作,但我对它返回值的方式不满意。我需要的是箱子的中心而不是上端和下端 我也尝试使用cut2{Hmisc},这给了我每个箱子的中心,但是它划分了包含相同数量的观察的箱子中的数据范围,而不是长度相同。

有没有人有解决方案?

3 个答案:

答案 0 :(得分:10)

用这样的东西来制作休息和标签并不难。这里由于中点是单个数字,我实际上并不返回带标签的因子,而是返回数字向量。

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中断和中点;我没有考虑到这一点。

请注意,这个答案与Joshua的不同;他给出了每个箱子中数据的中位数,而这给出了每个箱子的中心。

> 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

答案 1 :(得分:7)

像这样使用ave

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

答案 2 :(得分:0)

我们可以使用软件包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中一样是一个字符向量,但也可以是两个参数的函数,第一个是bin中包含的值,第二个垃圾箱的切割点。

more on cutr and smart_cut