簡體   English   中英

在帶有cut2的pretty_breaks時避免空的和小的組

[英]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)

我嘗試過的

第一種方法

我試圖用玩eps.correct = 0的值pretty_breaks像代碼:

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

但沒有任何一個價值使我接近某個地方

第二種方法

我也嘗試過在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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM