You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:06:02