首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从向量中删除某些项?

如何从向量中删除某些项?
EN

Stack Overflow用户
提问于 2019-03-14 15:33:58
回答 8查看 189关注 0票数 6

示例载体(基因转录本ids):

代码语言:javascript
复制
a <- c('MSTRG.7176.1', 'MSTRG.7176.2', 'AT2G26340.2', 'AT2G26355.1')

这是一个长向量的子集,如何删除以'MS‘开头的项,然后去掉左边项的末尾2位数?

EN

回答 8

Stack Overflow用户

发布于 2019-03-14 15:37:44

如果我们想要像@sindri_baldur提到的那样完全避免正则表达式,我们可以使用

代码语言:javascript
复制
string <- a[!startsWith(a, "MS")]
substr(string, 1, nchar(string) - 2)

或者使用grepsubstr

代码语言:javascript
复制
string <- grep('^MS',a, invert = TRUE, value = TRUE)
substr(string, 1, nchar(string) - 2)
#[1] "AT2G26340" "AT2G26355"

因为我们有相当多的新答案,添加了基准测试,包括所有长度为400k的向量。

代码语言:javascript
复制
a <- c('MSTRG.7176.1', 'MSTRG.7176.2', 'AT2G26340.2', 'AT2G26355.1')
a <- rep(a, 100000)

library(microbenchmark)

microbenchmark(
ronak1 = {string <- a[!startsWith(a, "MS")];substr(string, 1, nchar(string) - 2)}, 
ronak2 = {string <- grep('^MS',a, invert = TRUE, value = TRUE);substr(string, 1, nchar(string) - 2)}, 
sotos = {word(a[!str_detect(a, '^MS')], 1, sep = fixed('.'))}, 
thothal = {b1 <- a[!grepl("^MS", a)];gsub("\\.[0-9]$", "", b1)}, 
zx8754 = tools::file_path_sans_ext(a[ !grepl("^MS", a) ]), 
tmfmnk = dirname(chartr(".", "/", a[!grepl("^MS", a)])), 
NelSonGon = {b<-stringi::stri_replace_all(stringi::stri_sub(a,1,-3),regex="^M.*","");b[grepl('\\w+',b)]}
)


#Unit: milliseconds
#      expr        min         lq       mean     median         uq       max neval
#    ronak1   34.75928   38.58217   45.63393   40.32845   44.24355  225.2581   100
#    ronak2   94.10687   96.72758  110.83819   99.26914  105.98822  938.2969   100
#     sotos 1926.21112 2500.27209 2852.43240 2861.61699 3173.10420 4478.7890   100
#   thothal  155.95328  160.62800  169.02275  164.46494  169.32770  218.5033   100
#    zx8754  172.96970  179.03618  186.12374  183.96887  188.06251  234.1895   100
#    tmfmnk  189.29085  195.14593  208.89245  199.47172  204.40604  547.7497   100
# NelSonGon  186.54426  198.29856  226.19221  206.54542  217.92970  948.2535   100
票数 7
EN

Stack Overflow用户

发布于 2019-03-14 15:42:20

这里也有一个stringr一行程序,

代码语言:javascript
复制
library(stringr)

word(a[!str_detect(a, '^MS')], 1, sep = fixed('.'))
#[1] "AT2G26340" "AT2G26355"
票数 5
EN

Stack Overflow用户

发布于 2019-03-14 15:36:25

代码

代码语言:javascript
复制
a <- a[!grepl("^MS", a)]
gsub("\\.[0-9]$", "", a)
# [1] "AT2G26340" "AT2G26355"

说明

  1. 使用regex过滤掉所有再次以MS
  2. Use regex开头的元素,以替换剩余元素

中的点和最后一位数字

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55157124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档