首页 > 解决方案 > 基于特定模式对 R 中的字符向量进行子集化

问题描述

我有一个字符 id 向量,作为 R 中数据框的行名。行名具有以下模式:

head(foo)
[1] "ENSG00000197372 (ZNF675)"   "ENSG00000112624 (GLTSCR1L)"
[3] "ENSG00000151320 (AKAP6)"    "ENSG00000139910 (NOVA1)"   
[5] "ENSG00000137449 (CPEB2)"    "ENSG00000004779 (NDUFAB1)"

我想以某种方式对上述行名(〜700个条目)进行子集化,以便仅保留括号部分中的基因符号 - 即 ZNF675 - 并删除其余部分:这可以通过像 gsub 这样的函数吗?

标签: rsubsetdata-manipulation

解决方案


我们可以sub用来匹配不是(的字符,然后捕获里面的(不是a的字符,并将其)替换\\1为捕获组的反向引用()

row.names(foo) <- sub("^[^(]+\\(([^)]+).*", "\\1", row.names(foo))
row.names(foo)
#[1] "ZNF675"   "GLTSCR1L" "AKAP6"    "NOVA1"    "CPEB2"    "NDUFAB1" 

或使用str_extractfromstringr

library(stringr)
str_extract(row.names(foo), "(?<=\\()[^)]+")

数据

foo <- data.frame(col1 = rnorm(6))
row.names(foo) <- c("ENSG00000197372 (ZNF675)", 
  "ENSG00000112624 (GLTSCR1L)", "ENSG00000151320 (AKAP6)", 
     "ENSG00000139910 (NOVA1)",
   "ENSG00000137449 (CPEB2)", "ENSG00000004779 (NDUFAB1)")

推荐阅读