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)))
有什么看法? - sgibbfindInterval(x-1,vec)
是否是你要找的东西? - thelatemailfindInterval.rightClosed2
。 - flodelPOSIXt
对象,但最好是任何具有比较运算符的对象),就像findInterval
一样(findInterval
适用于任何支持as.double
方法的对象)。上面的第一个函数成功了,但第二个失败了,因为没有办法否定POSIXt
对象。 - Ken Williams