如何在R中使用sub函数保留gene_id中“.”之前的内容?
解决方法
错误原因分析
你之前的代码存在两个问题:
- 正则表达式逻辑错误:
.*^.的匹配逻辑混乱,.*会匹配任意字符,^代表行首却放在表达式中间,.代表任意单个字符,最终错误删除了首字母E,且没正确匹配.后的内容。 - 数据范围错误:直接操作
gene_annot_parsed$gene_id仅提取了单列,导致其他列丢失。
正确实现方式
方法一:Base R 直接修改原数据框
使用sub函数搭配正确的正则表达式,直接赋值给原数据框的gene_id列,保留所有其他列:
# 修改gene_id列,保留.之前的内容 gene_annot_parsed$gene_id <- sub("\\..*", "", gene_annot_parsed$gene_id)
正则解释:\\..*中,\\.转义后匹配真实的.,.*匹配.之后的所有字符,替换为空字符串即可保留.前的内容。
方法二:Tidyverse 风格(dplyr)
若习惯使用tidyverse工具包,可通过mutate函数精准修改指定列:
library(dplyr) gene_annot_parsed <- gene_annot_parsed %>% mutate(gene_id = sub("\\..*", "", gene_id))
验证结果
执行修改后查看数据框:
gene_annot_parsed
输出结果如下(gene_id已正确处理,其他列完整保留):
# A tibble: 5 × 6 chr gene_id gene_name start end gene_type <dbl> <chr> <chr> <dbl> <dbl> <chr> 1 1 ENSG00000223972 DDX11L1 11869 14403 transcribed_unprocessed_pseudogene 2 1 ENSG00000227232 WASH7P 14410 29553 unprocessed_pseudogene 3 1 ENSG00000278267 MIR6859-1 17369 17436 miRNA 4 1 ENSG00000243485 MIR1302-2HG 29571 31109 lincRNA 5 1 ENSG00000237613 FAM138A 34554 36081 lincRNA
内容的提问来源于stack exchange,提问作者rheabedi1
相关产品推荐
相关产品推荐

