繁体   English   中英

基于 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)

这是一个简单的模式,所以我的几乎所有序列的长度都是 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM