我曾在这里提出一个相关问题,但意识到计算此复杂度量需要耗费太多时间(而目标是与随机化测试一起使用,因此速度是一个问题)。 因此,我决定放弃加权,并仅使用两个度量之间的最小距离。 所以在这里,我有两个向量(在数据框中进行演示,但实际上它们是两个向量)。
x y
1 FALSE TRUE
2 FALSE FALSE
3 TRUE FALSE
4 FALSE FALSE
5 FALSE TRUE
6 FALSE FALSE
7 FALSE FALSE
8 TRUE FALSE
9 FALSE TRUE
10 TRUE TRUE
11 FALSE FALSE
12 FALSE FALSE
13 FALSE FALSE
14 FALSE TRUE
15 TRUE FALSE
16 FALSE FALSE
17 TRUE TRUE
18 FALSE TRUE
19 FALSE FALSE
20 FALSE TRUE
21 FALSE FALSE
22 FALSE FALSE
23 FALSE FALSE
24 FALSE FALSE
25 TRUE FALSE
我已经编写了一些代码来找到最小距离,但是我需要更快的速度(减少不必要的调用和更好的向量化)。也许在基本的R中我无法更快。
## MWE EXAMPLE: THE DATA
x <- y <- rep(FALSE, 25)
x[c(3, 8, 10, 15, 17, 25)] <- TRUE
y[c(1, 5, 9, 10, 14, 17, 18, 20)] <- TRUE
## Code to Find Distances
xw <- which(x)
yw <- which(y)
min_dist <- function(xw, yw) {
unlist(lapply(xw, function(x) {
min(abs(x - yw))
}))
}
min_dist(xw, yw)
有没有办法在基本的R中提高性能?使用
dplyr
或data.table
吗?我的向量要长得多(10,000+元素)。
根据flodel的测试结果进行编辑。flodel,我预料到了MWE中可能会出现的问题,但我也不知道该如何解决。如果任何x位置小于最小y位置,则会出现问题。
x <- y <- rep(FALSE, 25)
x[c(3, 8, 9, 15, 17, 25)] <- TRUE
y[c(5, 9, 10, 13, 15, 17, 19)] <- TRUE
xw <- which(x)
yw <- which(y)
flodel <- function(xw, yw) {
i <- findInterval(xw, yw)
pmin(xw - yw[i], yw[i+1L] - xw, na.rm = TRUE)
}
flodel(xw, yw)
## [1] -2 -1 -6 -2 -2 20
## Warning message:
## In xw - yw[i] :
## longer object length is not a multiple of shorter object length
all.inside = TRUE
的作用。感谢你向我介绍了一个新的函数。 - Tyler Rinker