【问题标题】:Subset a character vector in R based on a specific pattern基于特定模式对 R 中的字符向量进行子集化
【发布时间】:2018-11-06 18:27:25
【问题描述】:

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

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

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

【问题讨论】:

  • 一旦去除了 ensembl-ID,基因符号是否是唯一的?
  • 亲爱的 Russ Hyde,是的,没有返回重复值

标签: r subset data-manipulation


【解决方案1】:

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

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

或者使用来自stringrstr_extract

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)")

【讨论】:

  • 非常感谢阿克伦!我特别为 gsub 的第一部分和模式参数而苦苦挣扎!
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多