r - 如何操作一列的两 block ?

标签 r regex bioinformatics genetics

我正在处理一些遗传数据,但我的其中一个专栏不是我想要的格式。我不知道这里讨论了多少生物学,但我正在尝试修复我的氨基酸在我的数据中的显示方式。

氨基酸显然有一个名字,但它们也有一个 3 个字母的缩写和一个 1 个字母的缩写。我的数据包含 3 个字母形式的氨基酸,但我想将它们更改为 1 个字母的缩写。这是我的数据示例。

 chr location           effect   impact AA_change
   1    12543 missense_variant MODERATE  p.Ala12Val
   1    52367 missense_variant MODERATE  p.Leu54Pro
   1   752347 missense_variant MODERATE  p.Met99Ser
   1   984645 missense_variant MODERATE  p.Lys34Ile
   1   989845 missense_variant MODERATE  p.Arg4Cys
   1   999854 missense_variant MODERATE  p.His43Gly
   1   999855 missense_variant MODERATE  p.Glu14Phe

dat <- structure(list(chr = c(1L, 1L, 1L, 1L, 1L, 1L, 1L), location = c(12543L, 
52367L, 752347L, 984645L, 989845L, 999854L, 999855L), effect = c("missense_variant", 
"missense_variant", "missense_variant", "missense_variant", "missense_variant", 
"missense_variant", "missense_variant"), impact = c("MODERATE", 
"MODERATE", "MODERATE", "MODERATE", "MODERATE", "MODERATE", "MODERATE"
), AA_change = c("Ala12Val", "Leu54Pro", "Met99Ser", "Lys34Ile", 
"Arg4Cys", "His43Gly", "Glu14Phe")), .Names = c("chr", "location", 
"effect", "impact", "AA_change"), row.names = c(NA, -7L), class = "data.frame")

这是一个 3 字母氨基酸的列表,以及它们更好的缩写是什么。

  Ala == A
  Arg == R
  Asn == N
  Asp == D
  Cys == C
  Glu == E
  Gln == Q
  Gly == G
  His == H
  Ile == I
  Leu == L
  Lys == K
  Met == M
  Phe == F
  Pro == P
  Ser == S
  Thr == T
  Trp == W
  Tyr == Y
  Val == V

我觉得有一个简单的功能可以做到这一点,但我正在努力解决如何做到这一点。我习惯于只更改专栏的一部分,而不是一次更改两件事。所以我想问的是我怎样才能改变这个

Ala12Val
Leu54Pro
Met99Ser
Lys34Ile
Arg4Cys
His43Gly
Glu14Phe

为此

A12V
L54P
M99S
K32I
R4C
E14F

这是可以做到的吗?

最佳答案

查找氨基酸,然后获取前 3 个字母的子串和映射,提取数字,后 3 个字母的子串和映射。然后粘贴在一起。

# lookup map
AAmap <- setNames(c("A","R","N","D","C","E","Q","G","H","I","L","K","M","F","P","S","T","W","Y","V"),
                  c("Ala","Arg","Asn","Asp","Cys","Glu","Gln","Gly","His","Ile","Leu","Lys","Met","Phe","Pro","Ser","Thr","Trp","Tyr","Val"))

# get first 3 map to AA, get digits, get last 3 map to AA
dat$AA_change_short <-
  paste0(AAmap[ substr(dat$AA_change, 1, 3) ],
         gsub("[^\\d]+", "", dat$AA_change, perl = TRUE),
         AAmap[ substr(dat$AA_change, nchar(dat$AA_change) - 2, nchar(dat$AA_change)) ])

dat
#   chr location           effect   impact AA_change AA_change_short
# 1   1    12543 missense_variant MODERATE  Ala12Val            A12V
# 2   1    52367 missense_variant MODERATE  Leu54Pro            L54P
# 3   1   752347 missense_variant MODERATE  Met99Ser            M99S
# 4   1   984645 missense_variant MODERATE  Lys34Ile            K34I
# 5   1   989845 missense_variant MODERATE   Arg4Cys             R4C
# 6   1   999854 missense_variant MODERATE  His43Gly            H43G
# 7   1   999855 missense_variant MODERATE  Glu14Phe            E14F

关于r - 如何操作一列的两 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51142998/

相关文章:

python - 如何将文本文件中的蛋白质能量数据格式化为 scikit 特征算法的 matlab

python - 如何计算由另一种行分隔的一组行中的字符?

r unlist 函数意外结果

r - httr::POST 中查询和正文之间的区别

R - 在过滤不需要的数据后自动从多个 csv 文件创建散点图

ruby - 在子类 Subregex 中重写 Regexp 的 =~ 运算符,导致执行 "example"=~ subregexex 时出现奇怪的行为

python - 使用正则表达式将文本文件拆分为多个新文件

regex - 我无法通过 awk 处理数据

linux - 在 Linux 上安装 MRBAYES 3.2

c++ - R CMD SHLIB 使用 RcppArmadillo 编译错误