我正在使用 cut 函数将我的数据拆分为相等的 bin,它可以完成这项工作,但我对它返回值的方式不满意。我需要的是垃圾箱的中心,而不是上下两端。
我也尝试过使用cut2{Hmisc}
,这给了我每个箱的中心,但它划分了箱中包含相同数量的观察值的数据范围,而不是相同的长度。
有人对此有解决方案吗?
我正在使用 cut 函数将我的数据拆分为相等的 bin,它可以完成这项工作,但我对它返回值的方式不满意。我需要的是垃圾箱的中心,而不是上下两端。
我也尝试过使用cut2{Hmisc}
,这给了我每个箱的中心,但它划分了箱中包含相同数量的观察值的数据范围,而不是相同的长度。
有人对此有解决方案吗?
用这样的东西自己做休息和标签并不难。在这里,由于中点是一个数字,我实际上并没有返回带有标签的因子,而是返回一个数字向量。
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 中数据的中位数,而这给出了每个 bin 的中心。
> 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
ave
像这样使用:
set.seed(21)
x <- sample(0:20, 100, replace=TRUE)
xCenter <- ave(x, cut(x,3), FUN=median)
我们可以使用smart_cut
from package 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
可以像 in 一样是字符向量base::cut.default
,但也可以是 2 个参数的函数,第一个是 bin 中包含的值,第二个是 bin 的切点。