簡體   English   中英

將一定范圍的值划分為等長的區間:cut vs cut2

[英]divide a range of values in bins of equal length: cut vs cut2

我正在使用cut函數將數據分成相等的bin,它可以完成工作,但是我對返回值的方式不滿意。 我需要的是垃圾箱的中心,而不是上下兩端。
我也嘗試過使用cut2{Hmisc} ,這給了我每個bin的中心,但是它將數據范圍划分為bin中包含相同數量的觀察值,而不是相同長度的數據。

有人對此有解決方案嗎?

像這樣,讓自己休息一下並貼上標簽並不難。 在這里,由於中點是單個數字,因此我實際上沒有返回帶有標簽的因數,而是返回了一個數字向量。

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]
}

可能有一種更好的方法來獲取垃圾箱中斷和中點; 我沒有很難考慮。

注意,這個答案與約書亞的答案不同。 他給出了每個分類中數據的中位數,而給出了每個分類中的數據中心。

> 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從包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可以是一個字符向量,就像base::cut.default ,但也可以是2個參數的函數,第一個是bin中包含的值,第二個是垃圾箱。

有關cutr和smart_cut的更多信息

暫無
暫無

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

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