gpt4 book ai didi

r - 具有右闭区间的 findInterval()

转载 作者:行者123 更新时间:2023-12-03 12:58:11 25 4
gpt4 key购买 nike

伟大的findInterval() R 中的函数在其 vec 中使用左闭子区间参数,如其文档所示:

if i <- findInterval(x,v), we have v[i[j]] <= x[j] < v[i[j] + 1]



如果我想要右闭子区间,我有什么选择?我想出的最好的是:
findInterval.rightClosed <- function(x, vec, ...) {
fi <- findInterval(x, vec, ...)
fi - (x==vec[fi])
}

另一个也有效:
findInterval.rightClosed2 <- function(x, vec, ...) {
length(vec) - findInterval(-x, -rev(vec), ...)
}

这是一个小测试:
x <- c(3, 6, 7, 7, 29, 37, 52)
vec <- c(2, 5, 6, 35)
findInterval(x, vec)
# [1] 1 3 3 3 3 4 4
findInterval.rightClosed(x, vec)
# [1] 1 2 3 3 3 4 4
findInterval.rightClosed2(x, vec)
# [1] 1 2 3 3 3 4 4

但如果有更好的解决方案,我希望看到任何其他解决方案。我所说的“更好”是指“在某种程度上更令人满意”或“感觉不像是杂物”,甚至可能是“更有效率”。 =)

(请注意, rightmost.closed 有一个 findInterval() 参数,但它有所不同——它仅指最终的子区间,并且具有不同的含义。)

最佳答案

编辑:对所有过道进行大扫除。

你可以看看 cut .默认情况下,cut使左开和右闭区间,可以使用适当的参数(right)进行更改。要使用您的示例:

x <- c(3, 6, 7, 7, 29, 37, 52)
vec <- c(2, 5, 6, 35)
cutVec <- c(vec, max(x)) # for cut, range of vec should cover all of x

现在创建四个应该做同样事情的函数:两个来自 OP,一个来自 Josh O'Brien,然后是 cut . cut 的两个参数已从默认设置更改: include.lowest = TRUE将为最小(最左边)的间隔创建一个两边都闭合的间隔。 labels = FALSE会导致 cut只返回 bin 的整数值,而不是创建一个因子,否则它会这样做。
findInterval.rightClosed <- function(x, vec, ...) {
fi <- findInterval(x, vec, ...)
fi - (x==vec[fi])
}
findInterval.rightClosed2 <- function(x, vec, ...) {
length(vec) - findInterval(-x, -rev(vec), ...)
}
cutFun <- function(x, vec){
cut(x, vec, include.lowest = TRUE, labels = FALSE)
}
# The body of fiFun is a contribution by Josh O'Brien that got fed to the ether.
fiFun <- function(x, vec){
xxFI <- findInterval(x, vec * (1 + .Machine$double.eps))
}

所有函数都返回相同的结果吗?是的。 (注意 cutVec 用于 cutFun )
mapply(identical, list(findInterval.rightClosed(x, vec)),
list(findInterval.rightClosed2(x, vec), cutFun(x, cutVec), fiFun(x, vec)))
# [1] TRUE TRUE TRUE

现在对 bin 的要求更高:
x <- rpois(2e6, 10)
vec <- c(-Inf, quantile(x, seq(.2, 1, .2)))

测试是否相同(注意使用 unname )
mapply(identical, list(unname(findInterval.rightClosed(x, vec))),
list(findInterval.rightClosed2(x, vec), cutFun(x, vec), fiFun(x, vec)))
# [1] TRUE TRUE TRUE

和基准:
library(microbenchmark)
microbenchmark(findInterval.rightClosed(x, vec), findInterval.rightClosed2(x, vec),
cutFun(x, vec), fiFun(x, vec), times = 50)
# Unit: milliseconds
# expr min lq median uq max
# 1 cutFun(x, vec) 35.46261 35.63435 35.81233 36.68036 53.52078
# 2 fiFun(x, vec) 51.30158 51.69391 52.24277 53.69253 67.09433
# 3 findInterval.rightClosed(x, vec) 124.57110 133.99315 142.06567 155.68592 176.43291
# 4 findInterval.rightClosed2(x, vec) 79.81685 82.01025 86.20182 95.65368 108.51624

从这次运行开始, cut似乎是最快的。

关于r - 具有右闭区间的 findInterval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com