You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:50:36