微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查向量中的连续元素

如何解决检查向量中的连续元素

我有一个包含 K 个元素的向量,我需要检查它是否包含 2 个连续元素的精确子集。

假设 K = 6

vec = c(4,4,3,1,2,2)

我怎样才能得到一个指标来检查子集 (4,2) 作为连续元素?在这个例子中应该返回 FALSE 而 (3,1) 应该返回 TRUE。

解决方法

另一种方法可能是:

grepl("42",paste(vec,collapse = ""))

[1] FALSE

grepl("31",collapse = ""))

[1] TRUE
,

1) 使用具有相同功能的 rollapply。

library(zoo)

vec <- c(4,4,3,1,2,2)
x <- c(4,2)
any(rollapply(vec,length(x),identical,x))
## [1] FALSE

x <- c(3,1)
any(rollapply(vec,x))
## [1] TRUE

2) 使用 vec 和 x 创建字符串并使用 grepl:

x <- c(4,2)
grepl(sprintf("\\b%s\\b",toString(x)),toString(vec))
## [1] FALSE

x <- c(3,1)
grepl(sprintf("\\b%s\\b",toString(vec))
## [1] TRUE

3) 如果 x 总是有两个元素,则:

x <- c(4,2)
any(head(vec,-1) == x[1] & tail(vec,-1) == x[2])
## [1] FALSE

x <- c(3,1)
any(head(vec,-1) == x[2])
## [1] TRUE
,

特别是如果您要检查的元素超过 2 个,这可能是值得的:

vec <-= c(4,2)
chk <- c(3,1)

as.logical(length(Reduce(intersect,lapply(seq_along(chk),function(x) which(chk[x] == lead(vec,x - 1))))))
# [1] TRUE

chk <- c(4,1)
as.logical(length(Reduce(intersect,x - 1))))))
# [1] FALSE
,

使用基础 R:

find_subsequence = function (vec,needle) {
    sub_idx = seq_along(needle) - 1L
    Filter(
        function (i) all(needle == vec[sub_idx + i]),seq_len(length(vec) - length(needle) + 1L)
    )
}
find_subsequence(vec,c(3,1))
# [1] 4
find_subsequence(vec,c(4,2))
# integer(0)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。