gsub-从单词的末尾修剪字母/数字序列

时间:2019-01-28 10:34:36

标签: r grep gsub

我列出了900个这样的名字:

  • miR.30a.5p.11TC.0.0.0
  • miR.30a.5p.0.G.0.ag
  • miR.21.5p.0.A.0.tga
  • miR.30a.3p.0.TA.c.c

我想知道有多少个miR在序列的最后一个点之前具有“ 0”。我尝试了grep和gsub的不同组合(以删除最后一个点后的字母/数字),但是由于末尾字母的长度可变,我无法解决。感谢您的帮助。

预期输出为:

  • 最后一个点之前的miR数为0(例如:miR.21.5p.0.A.0.tga,但不包括:miR.30a.3p.0.TA.c.c)。
  • 或修剪掉最后一个点之后的所有内容
  • miR.30a.5p.11TC.0.0
  • miR.30a.5p.0.G.0

3 个答案:

答案 0 :(得分:1)

示例数据

names <- c("miR.30a.5p.11TC.0.0.0", 
       "miR.30a.5p.0.G.0.ag", 
       "miR.21.5p.0.A.0.tga", 
       "miR.30a.3p.0.TA.c.c", 
       "miR.30a.5p.11TC.0.0", 
       "miR.30a.5p.0.G.0")

工作流程

  1. 用'。'分隔字符串。
  2. 反向分割向量
  3. 采用第二要素
filt <- unlist(lapply(lapply(strsplit(names, ".", fixed=T), rev), "[[", 2)) == "0" # boolean vector with TRUE where 
sum(filt) # nb of files with zeros as second last element

最好, 克里斯

答案 1 :(得分:0)

基于R的想法

sum(sapply(x, function(i){i1 <- strsplit(i, '.', fixed = TRUE)[[1]]; 
                          i1[(length(i1)) - 1] == 0}))

#[1] 3

或使用stringr

#For the sum,
sum(stringr::word(x, -2, sep = '\\.') == 0)
#[1] 3

#For trimming
stringr::word(x, 1, -2, sep = '\\.')
#[1] "miR.30a.5p.11TC.0.0" "miR.30a.5p.0.G.0"    "miR.21.5p.0.A.0"   "miR.30a.3p.0.TA.c"

数据

x <- c('miR.30a.5p.11TC.0.0.0', 
       'miR.30a.5p.0.G.0.ag', 
       'miR.21.5p.0.A.0.tga', 
       'miR.30a.3p.0.TA.c.c')

答案 2 :(得分:0)

sum(gsub('.*\\.(.*)\\..*','\\1',x)==0)
[1] 3


      

  • .*任意数量的字符,也可能包含点       
  • \\.文字点       
  • (.*)组,任意数量的字符。我们将使用\\1将该小组归还       
  • \\..*文字点“最后一个点”后跟任意数量的字符