微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一种基于R

如何解决一种基于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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。