删除"."后面的字符串

110

我正在处理NCBI参考序列访问号,例如变量a

a <- c("NM_020506.1","NM_020519.1","NM_001030297.2","NM_010281.2","NM_011419.3", "NM_053155.2")  

从biomart包中获取信息时,我需要删除访问号后面的.1.2等字符。 我通常使用以下代码来完成此操作:

b <- sub("..*", "", a)

# [1] "" "" "" "" "" ""

但是正如您所看到的,这不是这个变量的正确用法。有谁能帮助我解决这个问题吗?

6个回答

158
您只需要转义句点即可:
a <- c("NM_020506.1","NM_020519.1","NM_001030297.2","NM_010281.2","NM_011419.3", "NM_053155.2")

gsub("\\..*","",a)
[1] "NM_020506"    "NM_020519"    "NM_001030297" "NM_010281"    "NM_011419"    "NM_053155" 

澄清:使用基础包中的函数(即不使用其他包,如stringr),选项如下所示: b1 <- gsub("\..","",a, fixed=FALSE) b2 <- sub("\..","",a, fixed=FALSE) 在某些情况下,您可能需要更改fixed参数。但是,在这里,您必须将其设置为FALSE(默认值);否则它将无法工作。此外,您需要双重转义符号\\,否则会出现错误。 - David C.
1
你不会将它与 fixed 设为 TRUE,因为我们在这里使用正则表达式。 - Hansi

18

我们可以假装它们是文件名并删除 扩展名

tools::file_path_sans_ext(a)
# [1] "NM_020506"    "NM_020519"    "NM_001030297" "NM_010281"    "NM_011419"    "NM_053155"

12

你可以这样做:

sub("*\\.[0-9]", "", a)
或者
library(stringr)
str_sub(a, start=1, end=-3)

6
备选方案:str_replace(a,"\\.[0-9]","")str_replace(a,"\\..*","") - Paolo
5
str_sub(a, start = 1, end = -3) 这种解决方法假设只有两个字符需要删除("."和紧随其后的一个数字)。对于许多基因ID系统来说,版本中可能有多个数字(尤其是探针ID)。在这种情况下,更灵活的解决方案是使用 str_remove(a, pattern="\\..*")。在上面的代码中,该模式用于找到第一个句点(使用 "\\."),然后是之后的任何字符(".")任何次数("*")。 - Gabriel J. Odom

9
如果字符串需要固定长度,那么可以使用来自基本R的substr。但是,我们可以用regexpr获取.的位置,并在substr中使用它。
substr(a, 1, regexpr("\\.", a)-1)
#[1] "NM_020506"    "NM_020519"    "NM_001030297" "NM_010281"    "NM_011419"    "NM_053155"   

4
我们可以使用前瞻正则表达式来提取在.之前的字符串。
library(stringr)

str_extract(a, ".*(?=\\.)")
[1] "NM_020506"    "NM_020519"    "NM_001030297" "NM_010281"   
[5] "NM_011419"    "NM_053155"   

1
另一个选择是使用 stringr 中的 str_split 函数:
library(stringr)
str_split(a, "\\.", simplify=T)[,1]

[1] "NM_020506"    "NM_020519"    "NM_001030297" "NM_010281"    "NM_011419"    "NM_053155"   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接