R语言如何匹配列中A/B/C序列后选中序列及下方n个指定单元格
R语言实现方案
实现逻辑
- 首先识别Sequence列中连续匹配
A→B→C序列的起始行位置 - 对每个匹配到的起始位置,标记该行及后续共5行(3行匹配序列+2行额外行)的Selected列为对应Sequence值,其余行留空
代码实现
方案1:tidyverse生态实现(可读性高)
# 加载依赖包 library(dplyr) library(slider) # 构造原始表 Table1 <- data.frame( ID = 1:31, Sequence = c("A", "B", "D", "E", "A", "B", "C", "f", "n", "p", "C", "D", "D", "E", "A", "B", "C", "z", "t", "g", "A", "C", "D", "A", "B", "C", "p", "l", "x", "v", "A") ) # 自定义参数 n_extra <- 2 # 额外选取的行数 target_seq <- c("A", "B", "C") # 目标匹配序列 seq_len <- length(target_seq) total_mark_len <- seq_len + n_extra # 单次匹配总标记行数 # 识别所有匹配目标序列的起始位置 match_starts <- which( slide_lgl(Table1$Sequence, ~all(.x == target_seq), .before = 0, .after = seq_len-1, .complete = TRUE) ) # 生成所有需要标记的行索引,避免超出表格总行数 mark_rows <- unique(unlist(lapply(match_starts, function(x) x:min(x + total_mark_len -1, nrow(Table1))))) # 生成结果表 Table2 <- Table1 %>% mutate(Selected = ifelse(row_number() %in% mark_rows, Sequence, "")) # 验证结果和预期一致 expected_Selected <- c("", "", "", "", "A", "B", "C", "f", "n", "", "", "", "", "", "A", "B", "C", "z", "t", "", "", "", "", "A", "B", "C", "p", "l", "", "", "") identical(Table2$Selected, expected_Selected) # 返回TRUE
方案2:纯base R实现(无需安装第三方包)
# 构造原始表 Table1 <- data.frame( ID = 1:31, Sequence = c("A", "B", "D", "E", "A", "B", "C", "f", "n", "p", "C", "D", "D", "E", "A", "B", "C", "z", "t", "g", "A", "C", "D", "A", "B", "C", "p", "l", "x", "v", "A") ) # 自定义参数 n_extra <- 2 target_seq <- c("A", "B", "C") seq_len <- length(target_seq) total_mark_len <- seq_len + n_extra n_row <- nrow(Table1) # 识别匹配起始位置 match_starts <- c() for (i in 1:(n_row - seq_len +1)) { if (all(Table1$Sequence[i:(i+seq_len-1)] == target_seq)) { match_starts <- c(match_starts, i) } } # 生成标记行索引并赋值 mark_rows <- unique(unlist(lapply(match_starts, function(x) x:min(x + total_mark_len -1, n_row)))) Table1$Selected <- "" Table1$Selected[mark_rows] <- Table1$Sequence[mark_rows] Table2 <- Table1
内容的提问来源于stack exchange,提问作者Farshid Owrang
相关产品推荐
相关产品推荐

