获取特定范围内的值的频率

时间:2013-12-05 19:46:08

标签: r vector range

我有以下数据

data<-c(3,4,5,6,5,4,5,6,7,5)
lowerLimits<-c(2,4,6)
upperLimits<-c(4,6,8)

我如何计算数据中的元素&gt; = lowerLimits和&lt; upperLimits。 所以结果应该是这样的:

result<-c(1,6,3)

我确信使用循环会很容易,但这不会有效。有人知道更好的解决方案吗?

4 个答案:

答案 0 :(得分:1)

二进制索引树或BIT完全符合您的要求 - &gt; see this nice totorial

答案 1 :(得分:1)

您可以使用mapply和一点逻辑功能:

myfun <- function(ll, ul) {
    sum(data >= ll & data < ul)
}

mapply(myfun, lowerLimits, upperLimits)
# [1] 1 6 3

答案 2 :(得分:0)

> sapply(seq(length(lowerLimits)), function(x) sum(data > lowerLimits[x] & data <= upperLimits[x]))
[1] 3 6 1

答案 3 :(得分:0)

如果您的下限和上限是连续范围,您还可以使用cuttable

> data <- c(3,4,5,6,5,4,5,6,7,5)
> breaks <- c(2, 4, 6, 8)
> counts <- table(cut(data, breaks=breaks, right=FALSE))

[2,4) [4,6) [6,8) 
    1     6     3

注意counts将是table个对象,因此如果您需要向量,则可以as.vector(counts)