使用R中的`cut`对数据进行分箱时出错

时间:2016-11-24 21:38:39

标签: r

我正在尝试将值介于1到100,000之间的变量分成10组,每组10,000。我使用以下代码并收到错误。

cut(x, breaks = quantile(x, probs=seq(0, 100000, 10000)), include.lowest = TRUE)

我做错了什么?

1 个答案:

答案 0 :(得分:2)

嗯,起初我认为这是一个错字,但在评论中进行了一些讨论之后,我决定写一个答案。

quantile发生错误,probs应介于0和1之间(读?quantile)。

看起来你已经对以下两个感到困惑:

cut(x, breaks = seq(0, 100000, 10000), include.lowest = TRUE)
cut(x, breaks = quantile(x, prob = seq(0, 1, 0.1)), include.lowest = TRUE)

正如我所说,他们会给出不同的结果,特别是当你的数据不均匀分布时。

作为代表性示例,请考虑非均匀分布的数据,例如Beta分布式数据:

set.seed(0)
x <- rbeta(10000, 3, 5)

b1 <- seq(0, 1, 0.1)

b2 <- quantile(x, prob = seq(0, 1, 0.1), names = FALSE)
round(b2, 2)
# [1] 0.01 0.17 0.23 0.28 0.32 0.37 0.41 0.46 0.52 0.60 0.94

注意,b2b1之间的差异很大。您可以检查(经验)分位数 - 分位数图:

plot(b1, b2); abline(0, 1)

你会看到这些点与线偏离强烈。

在上面,b1给出了统一的bin单元格,而b2给出了不规则的bin单元格。现在考虑bin计数:

table(cut(x, breaks = b1, include.lowest = TRUE))
#  [0,0.1] (0.1,0.2] (0.2,0.3] (0.3,0.4] (0.4,0.5] (0.5,0.6] (0.6,0.7] (0.7,0.8] 
#      256      1239      2011      2242      1948      1323       685       245 
#(0.8,0.9]   (0.9,1] 
#       48         3 

table(cut(x, breaks = b2, include.lowest = TRUE))
#[0.0101,0.169]  (0.169,0.228]  (0.228,0.276]  (0.276,0.321]  (0.321,0.365] 
#          1000           1000           1000           1000           1000 
# (0.365,0.412]  (0.412,0.463]  (0.463,0.519]  (0.519,0.598]  (0.598,0.935] 
#          1000           1000           1000           1000           1000 
你看到了区别吗?如果我们按分位数设置断点,我们将对二进制数有统一的计数。