如何在R的dplyr中提取基因名指定字符间内容并创建新列?
优化基因名提取染色体信息的方法
有如下tibble数据框:
library(tidyverse) df1 <- tibble(genes=c("AT1G02205","AT1G02160","AT5G02160", "ATCG02160")) df1 #> # A tibble: 4 × 1 #> genes #> <chr> #> 1 AT1G02205 #> 2 AT1G02160 #> 3 AT5G02160 #> 4 ATCG02160
需要提取基因名中T和G之间的内容,创建名为chr的新列,最终得到如下结果:
#> genes chr #> <chr> #> 1 AT1G02205 Chr1 #> 2 AT1G02160 Chr1 #> 3 AT5G02160 Chr5 #> 4 ATCG02160 ChrC
原实现方法分三步处理,较为繁琐:
library(tidyverse) df1 <- tibble(genes=c("AT1G02205","AT1G02160","AT5G02160", "ATCG02160")) new.df <- df1 |> mutate(chr=str_extract(genes, "T(.*?)G")) |> mutate(chr=str_replace_all(chr, c("T"="", "G"=""))) |> mutate(chr=paste0("Chr",chr)) new.df #> # A tibble: 4 × 2 #> genes chr #> <chr> <chr> #> 1 AT1G02205 Chr1 #> 2 AT1G02160 Chr1 #> 3 AT5G02160 Chr5 #> 4 ATCG02160 ChrC
优化实现方式
利用正则捕获组可以直接提取目标内容,将三次mutate合并为一次,代码更简洁高效:
library(tidyverse) df1 <- tibble(genes=c("AT1G02205","AT1G02160","AT5G02160", "ATCG02160")) new.df <- df1 |> mutate(chr = str_replace(genes, "AT(.)G.*", "Chr\\1")) new.df #> # A tibble: 4 × 2 #> genes chr #> <chr> <chr> #> 1 AT1G02205 Chr1 #> 2 AT1G02160 Chr1 #> 3 AT5G02160 Chr5 #> 4 ATCG02160 ChrC
正则说明:
AT(.)G.*:匹配以AT开头的字符串,捕获T和G之间的单个字符,同时匹配G之后的所有内容Chr\\1:将匹配到的内容替换为Chr加上捕获组提取到的目标字符
如果后续遇到T和G之间有多个字符的场景,只需调整正则为AT(.*?)G.*,即可捕获两者之间的所有非贪婪匹配内容:
new.df <- df1 |> mutate(chr = str_replace(genes, "AT(.*?)G.*", "Chr\\1"))
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

