使用带有cut2的pretty_breaks时避免空组和小组

时间:2016-01-04 11:17:37

标签: r grouping distribution aggregation hmisc

我正在处理类似于下面创建的数据val值的变量:

# data --------------------------------------------------------------------

data("mtcars")
val <- c(mtcars$wt, 10.55) 

我正在以下列方式剪切此变量:

# Cuts --------------------------------------------------------------------

cut_breaks <- pretty_breaks(n = 10, eps.correct = 0)(val)
res <- cut2(x = val, cuts = cut_breaks)

产生以下结果:

> table(res)
res
[ 1, 2) [ 2, 3) [ 3, 4) [ 4, 5) [ 5, 6)       6       7       8       9 [10,11] 
      4       8      16       1       3       0       0       0       0       1

在创建的输出中,我想更改以下内容:

  • 我对使用一个值创建grup并不感兴趣。理想情况下,我希望每个组至少有3/4的值。自相矛盾的是,我可以留下具有0值的组,因为当我加入我的真实数据时,这些组会丢失。
  • 切割机制的任何更改都必须处理带有整数值的变量
  • 剪切必须漂亮。我试图避免像1.23 - 2.35这样的东西。考虑到分布,即使这些值最合理。
  • 实际上,我正在努力实现的目标是:尝试制造或多或少甚至漂亮的团队,如果得到一个非常小的团体然后将它与下一组碰撞,不要担心空组

完整代码

为方便起见,下面提供了完整的代码:

# Libs --------------------------------------------------------------------

   Vectorize(require)(package = c("scales", "Hmisc"),
                      character.only = TRUE)


   # data --------------------------------------------------------------------

   data("mtcars") val <- c(mtcars$wt, 10.55) 

   # Cuts --------------------------------------------------------------------

   cut_breaks <- pretty_breaks(n = 10, eps.correct = 0)(val) res <-
   cut2(x = val, cuts = cut_breaks)

我尝试了什么

第一种方法

我尝试使用代码中的eps.correct = 0中的pretty_breaks值:

cut_breaks <- pretty_breaks(n = cuts, eps.correct = 0)(variable)

但是没有一个值让我到处都很近

第二种方法

我也尝试在m= 5函数中使用cut2参数,但我会继续得到相同的结果。

评论回复

我的休息功能

我尝试了mybreaks函数,但是我必须在其中加入一些工作来获得更好的剪切以获得更多的变量。从广义上讲,pretty_breaks对我来说很好,突然发现不时发生的微小群体。

> set.seed(1); require(scales)
> mybreaks <- function(x, n, r=0) {
+   unique(round(quantile(x, seq(0, 1, length=n+1)), r))
+ }
> x <- runif(n = 100)
> pretty_breaks(n = 5)(x)
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> mybreaks(x = x, n = 5)
[1] 0 1

1 个答案:

答案 0 :(得分:1)

您可以使用quantile()功能作为一种相对简单的方法,在每个群组中获得相似数量的观察结果。

例如,这是一个函数,它为值为x的向量,所需数量的组n以及所需的舍入点r用于中断,并为您提供建议切点。

mybreaks <- function(x, n, r=0) {
  unique(round(quantile(x, seq(0, 1, length=n+1)), r))
}

cut_breaks  <- mybreaks(val, 5)
res <- cut(val, cut_breaks, include.lowest=TRUE)
table(res)

 [2,3]  (3,4] (4,11] 
     8     16      5