1

我尝试自动化我的功能来创建组。因此,我使用classIntervallsfrom the packageclassIntcutfrom the basepackage。我希望样式为“jenks”,默认情况下组大小为 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(data, tmp$brks, dig.lab = 20, include.lowest = T) 中的错误:'breaks' 不是唯一的。

我知道这个错误信息是什么意思。但是谁能帮我实现这个功能并让它工作。我已经听说过,cut2但我不确定我是否可以用 jenks 实现它。

4

1 回答 1

0

好的,我得到了它对代码的一些小改动。

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。

于 2013-04-03T22:07:07.987 回答