【发布时间】:2014-02-01 15:10:28
【问题描述】:
我问了一个相关的问题here,但我意识到我在计算这个复杂的度量时花费了太多时间(目标是与随机测试一起使用,所以速度是一个问题)。所以我决定放弃加权,只使用两个度量之间的最小距离。所以这里我有 2 个向量(在一个数据框中用于演示目的,但实际上它们是两个向量。
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 + 个元素)。
编辑每个弗洛德尔的替补席。我在 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
【问题讨论】:
标签: r performance vector