在 R 中查找向量元素长度大于 1 的方法

5
我有一个像这样的向量
c(0,1,2,0,0,2,2,2,2,2,2,1,0,1,2,2,2,2,2,1)

我希望找到至少三个连续的2(即c(2,2,2))开始的位置,并且如果被中断,我想找到下一个第一个位置。

返回的向量应该长这样:

FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE

我尝试过match和其他几个函数,但都没有成功

3个回答

5
这是一种方式:
x <- c(0,1,2,0,0,2,2,2,2,2,2,1,0,1,2,2,2,2,2,1)
a <- rle(x)
z <- rep(FALSE, length(x))
z[sequence(a$lengths) == 1] <- a$lengths >= 2 & a$values == 2
z
#  [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
# [11] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

1
r <- rle(x)
# Which entries are true in the result:

w <- (cumsum(r$length)[r$values==2] - (r$length[r$values==2]-1))[r$length[r$values==2]>2]
result <- logical(length(x))
result[w] <- T
result
##  [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
## [17] FALSE FALSE FALSE FALSE

这可能比flodel的答案容易理解一些,但他的更好。 - Matthew Lundberg

0
这是我的函数尝试:
FUN <- function(x, n = 3) {
    y <- rle(x)
    z <- y[[1]] > (n - 1)
    unlist(lapply(1:length(z), function(i) {
        m <- rep(FALSE, each=y[[1]][i])
        if(z[i]) {
            m[1] <- TRUE
        }
        m
    }))
}

FUN(x)

##  [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
## [11] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接