基于 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)
我有一个文本向量,例如
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)