基于 R 中两个位置向量过滤向量的紧凑方法

Compact way to filter a vector base on two vectors of position in R

我有一个文本向量,例如

library(stringi)
MWE <- stri_rand_strings(200, 10, pattern = "[A-Za-z0-9]")

我的实际例子不是随机的,所以我找到了一些我想保留的重复出现的模式。 因此,我能够 grep 我的模式的开始和结束,并得到两个向量:

sequence_start <- c(9,44,56,73,85,98,110,122,140,152,164,176,188)
sequence_end <- c(14,49,61,78,91,103,115,127,145,157,169,181,193)

这是 easy 模式,所以我的几乎所有序列的长度都是 5,但是 1。一个是 6 和 2。出于更一般的原因,我想从提到的两个向量做。

我想要的输出是基于上述开始和结束序列的 MWE 提取序列,即 MWE[9:14], MWE[44:49] etc.

我可以用 for 循环来做到这一点(虽然我有一个警告):

Desired_Output <- rep(NA,length(sequence_start))
for (i in (1:length(sequence_start))){
  Desired_Output[i] = MWE[sequence_start[i]:sequence_end[i]]
}

但我试图提高我的编码技能,并且理解 for 应该尽可能避免循环,所以我想知道有什么更好的方法可以做到这一点。 我对输出的格式持开放态度。理想情况下,代码可读性是一个因素,因为我与 R 语言比我还不流利的人一起工作!

没有 显式 循环的一个选项正在使用 Map():

MWE[unlist(Map(seq, sequence_start, sequence_end))]

除非毫秒很重要,否则我认为循环很好。但我不认为当前循环正在做你想做的事?这里有一个修改:

Desired_Output <- list()
for (i in (1:length(sequence_start))){
  Desired_Output[[i]] = MWE[sequence_start[i]:sequence_end[i]]
}
Desired_Output <- unlist(Desired_Output)