将 pretty_breaks 与 cut2 一起使用时避免空的和小的组
Avoiding empty and small groups when using pretty_breaks with cut2
我正在使用类似于以下创建的数据 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
在创建的输出中,我想更改以下内容:
- 我对创建具有 一个 值的组不感兴趣。理想情况下,我希望每个组至少有 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)
我试过的
第一种方法
我尝试在 pretty_breaks
中使用 eps.correct = 0
值,就像在代码中一样:
cut_breaks <- pretty_breaks(n = cuts, eps.correct = 0)(variable)
但是 none 的值让我接近了
第二种方法
我也试过在 cut2
函数中使用 m= 5
参数,但我一直得到相同的结果。
评论回复
我的休息功能
我尝试了 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
您可以使用 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
我正在使用类似于以下创建的数据 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
在创建的输出中,我想更改以下内容:
- 我对创建具有 一个 值的组不感兴趣。理想情况下,我希望每个组至少有 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)
我试过的
第一种方法
我尝试在 pretty_breaks
中使用 eps.correct = 0
值,就像在代码中一样:
cut_breaks <- pretty_breaks(n = cuts, eps.correct = 0)(variable)
但是 none 的值让我接近了
第二种方法
我也试过在 cut2
函数中使用 m= 5
参数,但我一直得到相同的结果。
评论回复
我的休息功能
我尝试了 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
您可以使用 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