【发布时间】:2012-11-09 02:10:55
【问题描述】:
R 中出色的 findInterval() 函数在其 vec 参数中使用左闭子区间,如其文档所示:
如果
i <- findInterval(x,v),我们有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
但如果有更好的解决方案,我想看看其他解决方案。我所说的“更好”是指“在某种程度上更令人满意”或“感觉不像是杂物”,甚至可能是“更有效率”。 =)
(注意findInterval() 有一个rightmost.closed 参数,但它是不同的——它只指最终的子区间,具有不同的含义。)
【问题讨论】:
-
你怎么看:
findInterval(x, c(-Inf, head(vec, -1)))? -
@sgibb 似乎没有用,我添加了一个示例,而您的示例并没有给出相同的结果。
-
我在这里有点迷惑,但
findInterval(x-1,vec)是否符合您的要求? -
@thelatemail,只要是整数?
-
我认为可以发布您自己问题的答案。我的投票将投给您的
findInterval.rightClosed2。
标签: r binary-search