如果字符串以模式开头,则删除字符串的最后一个字符

时间:2018-09-24 03:04:16

标签: r regex

我有一列字符串,我想删除最后一个'之后的所有内容。像这样:

ENST00000338167.9
ABCDE.42927.6
ENST00000265393.10
ABCDE.43577.3
ENST00000370826.3

我要替换删除'。及之后的所有内容(仅适用于“ ENST”条目) 例如:

ENST00000338167
ABCDE.42927.6
ENST00000265393
ABCDE.43577.3
ENST00000370826

我可以做到

function(x) sub("\\.[^.]*$", "", x)

如果我尝试

function(x) sub("ENST*\\.[^.]*$", "", x)

这不是很有效,我还不太了解regex命令。

4 个答案:

答案 0 :(得分:3)

我们可以使用ifelsegreplsub的组合。我们首先检查字符串是否由“ ENST”字符串组成,如果确实包含,则删除“”之后的所有内容。使用sub

ifelse(grepl("^ENST", x), sub("\\..*", "", x), x)

#[1] "ENST00000338167" "ABCDE.42927.6"   "ENST00000265393" "ABCDE.43577.3"  
#[5] "ENST00000370826"

数据

x <- c("ENST00000338167.9","ABCDE.42927.6","ENST00000265393.10",
       "ABCDE.43577.3","ENST00000370826.3")

答案 1 :(得分:2)

我们可以在单个gsub调用中使用捕获组

gsub("(^ENST\\d+)\\.\\d+", "\\1", df[, 1])
#[1] "ENST00000338167" "ABCDE.42927.6"   "ENST00000265393" "ABCDE.43577.3"
#[5] "ENST00000370826"

样本数据

df <- read.table(text =
    "ENST00000338167.9
ABCDE.42927.6
ENST00000265393.10
ABCDE.43577.3
ENST00000370826.3", header = F)

答案 2 :(得分:0)

在更新data.table时,我们可以使用ij中指定逻辑条件

library(data.table)
setDT(df)[grepl("^ENST", Col1), Col1 := sub("\\.[^.]+$", "", Col1)]
df
#             Col1
#1: ENST00000338167
#2:   ABCDE.42927.6
#3: ENST00000265393
#4:   ABCDE.43577.3
#5: ENST00000370826

数据

df <- structure(list(Col1 = c("ENST00000338167.9", "ABCDE.42927.6", 
"ENST00000265393.10", "ABCDE.43577.3", "ENST00000370826.3")), row.names = c(NA, 
 -5L), class = "data.frame")

答案 3 :(得分:0)

我们可以使用startsWithsub组合:

数据:

 df=read.table(text="ENST00000338167.9
  ABCDE.42927.6
  ENST00000265393.10
  ABCDE.43577.3
  ENST00000370826.3",header=F)


# if string starts with ENST then remove everything after . (dot) in the 
#  string else print the string as it is.
  ifelse(startsWith(as.character(df[,1]),"ENST"),sub("*\\..*", "", df$V1),
      as.character(df[,1]))

输出:

[1] "ENST00000338167" "ABCDE.42927.6"   "ENST00000265393" "ABCDE.43577.3"   "ENST00000370826"