我尝试自动化我的功能来创建群组。因此,我使用classIntervalls
包中的classInt
和cut
包中的base
。我喜欢这种风格" jenks"并且groupize默认为10。如果少于10 unique
次观察,我希望组的数量是唯一观察的数量。
所以这就是我的尝试:
set.seed(45)
b=sample(1:50,10)
groupfunction<-function(data,my.style="jenks"){
ifelse(length(unique(data))<10,tmpbrk<-length(unique(data)),tmpbrk<-10)# tests if the number of unique values is bigger than 10
tmp<-classIntervals(data,tmpbrk,my.style,unique=T) #find the intervalls
tmp<-cut(data,tmp$brks,dig.lab=20,include.lowest = T) #cut the data by the breaks from the intervalls
tmp<-as.character(tmp) #turn results into characters to substitute unwanted characters
tmp<-gsubfn(".",list("["="",","="-",")"="","("=""," "="","]"=""),tmp) # substitute unwanted characters
}
groupfunction(b)
但是我收到一条错误消息:cut.default中的错误(数据,tmp $ brks,dig.lab = 20,include.lowest = T):&#39; break&#39;不是唯一的。
我知道此错误消息的含义。但任何人都可以帮助我实现这个功能并让它工作。我已经听说过cut2
,但我不确定我是否可以用jenks实现它。
答案 0 :(得分:0)
好吧,我得到了它与代码的一些小的acomodations。
groupfunction<-function(data,my.style="jenks"){
ifelse(length(unique(data))<11,tmpbrk<-length(unique(data))-1,tmpbrk<-10)# tests if the number of unique values is bigger than 10
tmp<-classIntervals(data,tmpbrk,style=my.style) #find the intervalls
tmp<-cut(data,unique(tmp$brks),dig.lab=20,include.lowest = T) #cut the data by the breaks from the intervalls
tmp<-as.character(tmp) #turn results into characters to substitute unwanted characters
tmp<-gsubfn(".",list("["="",","="-",")"="","("=""," "="","]"=""),tmp) # substitute unwanted characters
}
所以它实际上做的是它获取数据,控制唯一值的长度并检查它是否小于11。如果是这样,它将获取唯一值的长度-1并将其应用为构建jenks的中断数。然后,詹克斯建立在独特的价值观之上。 该功能适用于单个矢量或整个数据帧,但可以根据速度和df的大小减慢pc。