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
谢谢。
答案 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))