簡體   English   中英

gsub - 從單詞末尾修剪一系列字母/數字

[英]gsub - trim a sequence of letters/numbers from the end of a word

我有一個包含 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.cc

我很想知道有多少 miR 在序列中的最后一個點之前有“0”。 我嘗試了 grep 和 gsub 的不同組合(從最后一個點之后刪除字母/數字),但由於最后的字母長度可變,我無法解決。 我將非常感謝您的幫助。

預期輸出是:

  • 最后一個點前有 0 的 miR 的數量(例如這個:miR.21.5p.0.A.0.tga,但不是這個:miR.30a.3p.0.TA.cc)。
  • 或修剪最后一個點之后的所有內容
  • miR.30a.5p.11TC.0.0
  • miR.30a.5p.0.G.0
  • 等等。

示例數據

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

最好的,克里斯

基於 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')
sum(gsub('.*\\.(.*)\\..*','\\1',x)==0)
[1] 3


  • .*任意數量的字符,也可能包含點
  • \\\\. 文字點
  • (.*)任意數量的字符組。 我們將使用\\\\1取回該組
  • \\\\..*一個文字點“最后一個點”后跟任意數量的字符

  • 暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM