R:为数值变量创建不均匀的因子级别

R:为数值变量创建不均匀的因子级别,r,quantile,R,Quantile,我有一组从-0.20到+0.15的值(100000个条目),它们是返回百分比 大部分数值介于+3.5%和-3.5%之间 我希望将其转化为一个系数,以便: 任何介于-0.035到+0.035之间的收益均以0.05的增量进行等分,并且 任何介于-0.2到-0.035之间的值都作为一个因子和 0.05到0.15之间的任何值都作为一个因子变量进行分类 关于我如何在R中实现这一点,有什么想法吗?我确实尝试了剪切,但它似乎只是以相等的增量进行存储。因此我生成了保存值的向量(不均匀分布) 库(data.t

我有一组从-0.20到+0.15的值(100000个条目),它们是返回百分比

大部分数值介于+3.5%和-3.5%之间

我希望将其转化为一个系数,以便:

  • 任何介于-0.035到+0.035之间的收益均以0.05的增量进行等分,并且
  • 任何介于-0.2到-0.035之间的值都作为一个因子和
  • 0.05到0.15之间的任何值都作为一个因子变量进行分类

关于我如何在R中实现这一点,有什么想法吗?我确实尝试了
剪切
,但它似乎只是以相等的增量进行存储。

因此我生成了保存值的向量(不均匀分布)

库(data.table)
设定种子(555)#以便重复

N如果您
?cut
,则
breaks=
参数允许您定义自定义断点…因此可能
cut(stuff,breaks=c(-0.2,-0.035,seq(-0.03,0.035,by=0.005),0.05,0.15))
 library(data.table)
 set.seed(555)#in order to be reproducible
 N <- 100000#number of pseudonumbers to be generated
 min1=-0.035#arbitrary limits
 max1=0.035#idem

 samp <- runif(N,min = -0.2,max = 0.15)#create the vector 

 level1 <- as.factor(ifelse(samp<=min1,paste0("(",min(samp),",",min1,"]"),NA))#create the first level 
 level2 <- as.factor(ifelse(samp>=max1,paste0("[",max1,",",max(samp),")"),NA))#create the second level
 incr <- 0.005
 level3 <- cut(samp,seq(min1, max1, by = incr))#create the intermediate levels 

 dt <- data.table(samp,level1,level2,level3)#put all together
 mylevels <- na.omit(unlist(matrix(t(dt[,-1]))))#the vector that contains in which range the samp belongs to 
mylevels<-factor(mylevels,levels= unique(mylevels))
dt2<-dt[,.(samp,levels=mylevels)]
            samp                      levels
     1: -0.07023653 (-0.199996188434307,-0.035]
     2:  0.10889991   [0.035,0.149995080730878)
     3:  0.04246077   [0.035,0.149995080730878)
     4: -0.01193010              (-0.015,-0.01]
     5:  0.02607736                (0.025,0.03]
   ---                                        
 99996: -0.04786692 (-0.199996188434307,-0.035]
 99997: -0.08700210 (-0.199996188434307,-0.035]
 99998:  0.09989973   [0.035,0.149995080730878)
 99999:  0.10095336   [0.035,0.149995080730878)
100000: -0.05555869 (-0.199996188434307,-0.035]