登录
首页精彩阅读R语言︱噪声数据处理、数据分组—分箱法(离散化、等级化)
R语言︱噪声数据处理、数据分组—分箱法(离散化、等级化)
2017-07-17
收藏

R语言︱噪声数据处理、数据分组—分箱法(离散化、等级化)

分箱法在实际案例操作过程中较为常见,能够将一些数据离散化,等级化,比如年龄段,我们并不想知道确切的几岁,于是乎可以将其分组、分段。

基础函数中cut能够进行简单分组,并且可以用于等宽分箱法。

cut函数:cut(x, n):将连续型变量x分割为有着n个水平的因子.(参考来自: R语言︱数据集分组、筛选)


分箱法分为等深分箱(样本量一致,比等宽好)、等宽分箱(cut函数可以直接获取)。

着重看一下等深分箱法,笔者在这根据课程code之上,自己编译了一个等深分箱函数sbdeep。

[html]view plaincopyprint?

    sbdeep=function(data,parts,xiaoz){  
      parts<-parts         #分几个箱  
      xiaoz<-xiaoz         #极小值  
        value<-quantile(data,probs = seq(0,1,1/parts))  #这里以data等比分为4段,步长为1/4  
      number<-mapply(function(x){  
        for (i in 1:(parts-1))   
        {  
          if(x>=(value[i]-xiaoz)&x<value[i+1])  
          {  
            return(i)  
          }  
        }  
        if(x+xiaoz>value[parts])  
        {  
          return(parts)  
        }  
        return(-1)  
      },data)  
      #打标签L1L2L3L4  
      return(list(degree=paste("L",number,sep=""),degreevalue=number,value=table(value),number=table(number)))               #将连续变量转化成定序变量,此时为L1,L2,L3,L4...根据parts  
    } 

该函数是对单个序列数据进行等深分箱,可以返回四类:

一个基于L1L2L3....的每个指标标签序列degree;

标签序列值degreevalue,

每个百分位数对应的变量值value,

不同百分点的数量number。

应用一:R语言等宽分箱小案例

R语言的等宽分箱法一般都是用cut来获取,但是用法来说在网上还是比较少见的。譬如这里有一个需求就是把连续数列,根据等宽分箱的办法切分开来。这个应该怎么做呢?

来看一个cut的案例:

[plain]view plaincopyprint?
    > a <- c(1,2,3,4,5,6,4,3,2,1)  
    > cut(a,10)  
     [1] (0.995,1.5] (1.5,2]     (2.5,3]     (3.5,4]     (4.5,5]     (5.5,6]     (3.5,4]     (2.5,3]     (1.5,2]     (0.995,1.5]  
    Levels: (0.995,1.5] (1.5,2] (2,2.5] (2.5,3] (3,3.5] (3.5,4] (4,4.5] (4.5,5] (5,5.5] (5.5,6]  
    > cut(a,10,labels=F)  
     [1]  1  2  4  6  8 10  6  4  2  1 

      一个数列,简单的cut滞后,就变成一个levels,因子型的一个区间范围,但是这个结果一般不是我们想要的,我们想要对连续数据进行切割。那么就是用R语言中的cut函数的,labels参数。

可以从案例中看到,labels=F之后,就变成了一系列等级型的分组序号,就像聚类一样,模型跑出来之后,就给数列打了一个标签。那么就可以这样选择你想要的,譬如我要选择连续变量的数值上的前10%的数值:



数据分析咨询请扫描二维码

客服在线
立即咨询