从混合字符串中提取特定位置的字母和数字

时间:2021-05-14 09:03:31

标签: r regex

df
   Chromosome aaChange
1          16 p.E548fs
2          16   p.S64X
3          16   p.P23H
4          16   p.G18V
5          16  p.L251S

我想提取第三个字母和后面的数字。下面是我想要的输出。

   Chromosome aaChange Protein_position
 1         16 p.E548fs             E548
 2         16   p.S64X              S64
 3         16   p.P23H              P23
 4         16   p.G18V              G18
 5         16  p.L251S             L251

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以在基础 R 中使用 sub 执行此操作:

transform(df, Protein_position = sub('..(.\\d+).*', '\\1', aaChange))

#  Chromosome aaChange Protein_position
#1         16 p.E548fs             E548
#2         16   p.S64X              S64
#3         16   p.P23H              P23
#4         16   p.G18V              G18
#5         16  p.L251S             L251

数据

df <- structure(list(Chromosome = c(16L, 16L, 16L, 16L, 16L), 
aaChange = c("p.E548fs", "p.S64X", "p.P23H", "p.G18V", "p.L251S")), 
class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:1)

您要匹配的模式似乎很简单:它总是以大写字母开头,后面紧跟一系列一个或多个数字。这给出了模式 [A-Z]\\d+。我们可以将其输入到 str_extract 中:

library(stringr)
df$Protein_position <- str_extract(df$aaChange, "[A-Z]\\d+")
  Chromosome aaChange Protein_position
1         16 p.E548fs             E548
2         16   p.S64X              S64
3         16   p.P23H              P23
4         16   p.G18V              G18
5         16  p.L251S             L251

答案 2 :(得分:0)

tidyverse

library(dplyr)
library(stringr)
df %>%
   mutate(Protein_position = str_replace(aaChange,
      '^[^.]+\\.(.*)[^0-9]+$', '\\1'))

-输出

#  Chromosome aaChange Protein_position
#1         16 p.E548fs            E548f
#2         16   p.S64X              S64
#3         16   p.P23H              P23
#4         16   p.G18V              G18
#5         16  p.L251S             L251

数据

df <- structure(list(Chromosome = c(16L, 16L, 16L, 16L, 16L), 
aaChange = c("p.E548fs", "p.S64X", "p.P23H", "p.G18V", "p.L251S")), 
class = "data.frame", row.names = c(NA, -5L))