在R语言中如何查找多个连续元素匹配的起始与结束索引
实现方案
1. 纯Base R实现(无需额外安装包)
# 定义查找连续子集起始索引的函数 find_continuous_subset_start <- function(full, subset) { n_full <- length(full) n_sub <- length(subset) # 子集长度大于全量列表直接返回NA if (n_sub > n_full) return(NA) # 遍历所有可能的起始位置校验匹配 for (i in seq_len(n_full - n_sub + 1)) { if (identical(full[i:(i + n_sub - 1)], subset)) { return(i) } } return(NA) }
测试效果
full <- c("cat", "dog", "giraffe", "gorilla", "opossum", "rat") # 匹配场景 subset1 <- c("giraffe", "gorilla", "opossum") find_continuous_subset_start(full, subset1) # 输出:3 # 不连续匹配场景 subset2 <- c("giraffe", "rat", "gorilla", "opossum") find_continuous_subset_start(full, subset2) # 输出:NA
2. 同时返回起止索引的修改版
find_continuous_subset_range <- function(full, subset) { n_full <- length(full) n_sub <- length(subset) if (n_sub > n_full) return(c(start = NA, end = NA)) for (i in seq_len(n_full - n_sub + 1)) { if (identical(full[i:(i + n_sub - 1)], subset)) { return(c(start = i, end = i + n_sub - 1)) } } return(c(start = NA, end = NA)) } # 测试输出 find_continuous_subset_range(full, subset1) # start end # 3 5
3. 简洁向量化写法(依赖zoo包)
library(zoo) find_continuous_subset_start <- function(full, subset) { n_sub <- length(subset) if (n_sub > length(full)) return(NA) matches <- rollapply(full, width = n_sub, FUN = identical, y = subset) return(ifelse(any(matches), which(matches)[1], NA)) }
内容的提问来源于stack exchange,提问作者Vitaliy Ryabinin
相关产品推荐
相关产品推荐

