我使用R并且我有一个长数字向量。我想查找此向量中的所有最大连续子范围,其中所有值都低于某个阈值。
例如,如果给定的矢量是
5 5 6 6 7 5 4 4 4 3 2 1 1 1 2 3 4 5 6 7 6 5 4 3 2 2 3 4 4
且我的阈值为4(即=<3
),那么符合此条件的值标有x:
0 0 0 0 0 0 0 0 0 x x x x x x x 0 0 0 0 0 0 0 x x x x 0 0
我还希望返回(10,16), (24,27)
之类的内容。我该怎么做?
答案 0 :(得分:5)
要获取范围,您可以使用rle
首先创建编码
x <- c(5,5,6,6,7,5,4,4,4,3,2,1,1,1,2,3,4,5,6,7,6,5,4,3,2,2,3,4,4)
enc <- rle(x <= 3)
enc.endidx <- cumsum(enc$lengths) #ending indices
enc.startidx <- c(0, enc.endidx[1:(length(enc.endidx)-1)]) + 1 # starting indices
data.frame(startidx=enc.startidx[enc$values], endidx=enc.endidx[enc$values])
那应该给你
startidx endidx
1 10 16
2 24 27
答案 1 :(得分:1)
第一个问题的答案很简单:
x <- c(5,5,6,6,7,5,4,4,4,3,2,1,1,1,2,3,4,5,6,7,6,5,4,3,2,2,3,4,4)
y <- x<=3
y
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
[13] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[25] TRUE TRUE TRUE FALSE FALSE
as.numeric(y)
[1] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
获得你想要的指数更加困难
您可以按照whatnick的建议尝试which
另一种可能性是使用match
。它返回匹配的第一个元素。因此match(1,y)
将返回10. match(0,y[10:length(y)]) - 1
将返回16.如果您可以将其置于while
- 循环中,则可以根据需要获取索引。
答案 2 :(得分:0)
您需要的运营商是“哪个”。语法将是索引&lt; -which(vector&lt; = 3)。这将为您提供值满足条件的索引列表。要隔离转换,您可以使用索引的差异。如果差异超过1,则您有过渡边界。
答案 3 :(得分:0)
我也需要这样做,这就是我正在使用的:
ranges <- function(b){ # b must be boolean
b <- c(FALSE,b,FALSE)
d <- b[-1]-b[-length(b)]
return(data.frame(start=which(d==1),end=which(d==-1)-1))
}
在你的例子中
x <- c(5,5,6,6,7,5,4,4,4,3,2,1,1,1,2,3,4,5,6,7,6,5,4,3,2,2,3,4,4)
ranges(x<=3)
产生
start end
1 10 16
2 24 27