在R中扫描数组

时间:2010-09-02 08:15:22

标签: r vector

我使用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)之类的内容。我该怎么做?

4 个答案:

答案 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