R中的等频离散化

SFu*_*n28 5 r

我在R中找到执行等频离散化的函数时遇到了麻烦.我偶然发现了'infotheo'软件包,但经过一些测试后发现算法被破坏了.CRAN似乎不再支持"dprep".

编辑:

为清楚起见,我不需要分隔箱之间的值.我真的想要相同的频率,如果一个值最终在两个箱中,则无关紧要.例如:

c(1,3,2,1,2,2) 
Run Code Online (Sandbox Code Playgroud)

应该给一个箱子c(1,1,2)和一个c(2,2,3)

Jor*_*eys 7

编辑:鉴于你的真正目标,你为什么不这样做(纠正):

 EqualFreq2 <- function(x,n){
    nx <- length(x)
    nrepl <- floor(nx/n)
    nplus <- sample(1:n,nx - nrepl*n)
    nrep <- rep(nrepl,n)
    nrep[nplus] <- nrepl+1
    x[order(x)] <- rep(seq.int(n),nrep)
    x
}
Run Code Online (Sandbox Code Playgroud)

这将返回一个向量,其中包含指针所在的bin.但由于某些值可能存在于两个容器中,因此您无法定义容器限制.但你可以这样做:

x <- rpois(50,5)
y <- EqualFreq2(x,15)
table(y)
split(x,y)
Run Code Online (Sandbox Code Playgroud)

原始答案:

你可以轻松地使用cut() 它:

EqualFreq <-function(x,n,include.lowest=TRUE,...){
    nx <- length(x)    
    id <- round(c(1,(1:(n-1))*(nx/n),nx))

    breaks <- sort(x)[id]
    if( sum(duplicated(breaks))>0 stop("n is too large.")

    cut(x,breaks,include.lowest=include.lowest,...)

}
Run Code Online (Sandbox Code Playgroud)

这使 :

set.seed(12345)
x <- rnorm(50)
table(EqualFreq(x,5))

 [-2.38,-0.886] (-0.886,-0.116]  (-0.116,0.586]   (0.586,0.937]     (0.937,2.2] 
             10              10              10              10              10 

x <- rpois(50,5)
table(EqualFreq(x,5))

 [1,3]  (3,5]  (5,6]  (6,7] (7,11] 
    10     13     11      6     10 
Run Code Online (Sandbox Code Playgroud)

如您所见,对于离散数据,在大多数情况下,最佳的相等分级是不可能的,但是这种方法可以为您提供最佳的分级.

  • 你也可以使用`quantile`来设置你的休息:`table(cut(x,quantile(x),include.lowest = T))` (3认同)

Rei*_*son 5

通过使用(滥用?)格子的条件图基础设施,特别是函数,这种事情也很容易解决co.intervals():

cutEqual <- function(x, n, include.lowest = TRUE, ...) {
    stopifnot(require(lattice))
    cut(x, co.intervals(x, n, 0)[c(1, (n+1):(n*2))], 
        include.lowest = include.lowest, ...)
}
Run Code Online (Sandbox Code Playgroud)

这再现了@Joris的优秀答案:

> set.seed(12345)
> x <- rnorm(50)
> table(cutEqual(x, 5))

 [-2.38,-0.885] (-0.885,-0.115]  (-0.115,0.587]   (0.587,0.938]     (0.938,2.2] 
             10              10              10              10              10
> y <- rpois(50, 5)
> table(cutEqual(y, 5))

 [0.5,3.5]  (3.5,5.5]  (5.5,6.5]  (6.5,7.5] (7.5,11.5] 
        10         13         11          6         10
Run Code Online (Sandbox Code Playgroud)

在后者,离散的情况下,断裂是不同的,尽管它们具有相同的效果; 相同的观察结果都在同一个箱子里.


Rom*_*rik 5

怎么样?

a <- rnorm(50)
> table(Hmisc::cut2(a, m = 10))

[-2.2020,-0.7710) [-0.7710,-0.2352) [-0.2352, 0.0997) [ 0.0997, 0.9775) 
               10                10                10                10 
[ 0.9775, 2.5677] 
               10 
Run Code Online (Sandbox Code Playgroud)