我想运行Jenks的算法来查找数据中的自然中断。有一个名为classInt的包,它有一个函数,但是我需要在我无法安装软件包的机器上使用它,也不需要编译任何东西,它必须在基础R中完成。所以我查看了源代码和复制相关部分以创建jenks()函数。 然而,这个功能非常慢!对于长度为300的单个数字向量,需要0.8秒。
我无法弄清楚为什么,它只是几个用于预分配内存的矩阵上的循环。分析器说大部分时间都用在' - '函数中。有没有办法加快速度?
谢谢!
jenks <- function (var, n = 5) {
ovar <- var
d <- sort(var)
k <- n
mat1 <- matrix(1, length(d), k)
mat2 <- matrix(0, length(d), k)
mat2[2:length(d), 1:k] <- .Machine$double.xmax
v <- 0
for (l in 2:length(d)) {
s1 = s2 = w = 0
for (m in 1:l) {
i3 <- l - m + 1
val <- d[i3]
s2 <- s2 + val * val
s1 <- s1 + val
w <- w + 1
v <- s2 - (s1 * s1)/w
i4 <- trunc(i3 - 1)
if (i4 != 0) {
for (j in 2:k) {
if (mat2[l, j] >= (v + mat2[i4, j - 1])) {
mat1[l, j] <- i3
mat2[l, j] <- v + mat2[i4, j - 1]
}
}
}
}
mat1[l, 1] <- 1
mat2[l, 1] <- v
}
kclass <- 1:k
kclass[k] <- length(d)
k <- length(d)
last <- length(d)
for (j in length(kclass):1) {
id <- trunc(mat1[k, j]) - 1
kclass[j - 1] <- id
k <- id
last <- k - 1
}
brks <- d[c(1, kclass)]
res <- list(var = ovar, brks = brks)
res
}