我有一个字符ID的向量,作为R中数据帧的行名。行名具有以下模式:
head(foo)
[1] "ENSG00000197372 (ZNF675)" "ENSG00000112624 (GLTSCR1L)"
[3] "ENSG00000151320 (AKAP6)" "ENSG00000139910 (NOVA1)"
[5] "ENSG00000137449 (CPEB2)" "ENSG00000004779 (NDUFAB1)"
我想以某种方式对上述行名(〜700个条目)进行子集化,以便仅将基因符号保留在括号中,即ZNF675-删除其余部分:是否可以通过gsub之类的函数实现?
答案 0 :(得分:2)
我们可以使用sub
来匹配非(
的字符,然后捕获(
中不是)
的字符,并将其替换为反向引用( \\1
)的捕获组
row.names(foo) <- sub("^[^(]+\\(([^)]+).*", "\\1", row.names(foo))
row.names(foo)
#[1] "ZNF675" "GLTSCR1L" "AKAP6" "NOVA1" "CPEB2" "NDUFAB1"
或使用str_extract
中的stringr
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)")