仅使用括号中的条目对数据进行子集化

时间:2015-02-18 11:52:45

标签: r

如何在描述栏

的括号中对仅包含条目的数据进行子集化
 data=    ID            description                                   control   
        1814668     glycoprotein 2  (Gp2) (Fy2)                      LMN_2904435
        1791634     claudin 10 (Cldn10), transcript variant 1        ILMN_1214954 NM
        1790993     claudin 10 (Cldn10), transcript variant 2        ILMN_2515816

输出

      ID        description      control    
    1814668     Gp2, Fy2     LMN_2904435
    1791634     Cldn10        ILMN_1214954 NM
    1790993     Cldn10        ILMN_2515816

2 个答案:

答案 0 :(得分:5)

你可以尝试

 df2$description <- gsub('.*\\(([^)]+)\\).*', '\\1', df2$description)

或使用bracketXtract

中的qdap
 library(qdap)
 unlist(bracketXtract(df2$description, 'round'))

或者

 library(qdapRegex)
  unlist(rm_round(df2$description, extract=TRUE))

更新

基于新数据集&#34; df2N&#34;,

 df2N$description <- sapply(rm_round(df2N$description, 
                extract=TRUE),toString)

或使用str_extract

 library(stringr)
 sapply(str_extract_all(df2N$description, 
          perl('(?<=\\()[^)]+(?=\\))')), toString)

答案 1 :(得分:1)

可能没有@akrun的解决方案那么棒,但是这里有另一种选择,使用gsub中的函数base R(两次......):

df2$description <- gsub("^,\\s|,\\s$", 
                        "",
                        gsub("^[^(]*\\(|\\)[^()]*\\(|\\)[^(]*$", 
                             ", ", 
                             df2$description, perl=T))
#[1] "Gp2, Fy2" "Cldn10"  "Cldn10"

首先,它告诉R搜索:

  • ^[^(]*\\(:任何不是开头括号的东西,在开头 字符串,以开括号结尾
  • \\)[^()]*\\(:一个右括号,后跟任何不是括号的内容,以一个左括号结尾
  • \\)[^(]*$:一个结束括号,后跟任何不是开括号并直到字符串结尾的内容

并用逗号后跟空格替换它。

第二次,它会替换&#34;逗号,后跟空格&#34;在字符串的开头和结尾用空字符串。