2017-02-20 8 views
3

Я хочу извлечь часть string между третьим набором круглых скобок, предпочтительно используя основание R. Вот набор примеров данных:Извлечь строку между третьим набором круглых скобок

my.data <- read.table(text = ' 
    my.num        my.string         my.cov 
     1 Abc(~1)Fgf(~-1+e2:cp)Bca(~-1+g1+g2:ti+g2:cfi+g2:pp+g2:cp)q(~-1+re:se) 10 
     2 Abc(~1)Fgf(~-1+e1:e2:fi)Bca(~-1+g1+g2:ti+g2:pr+g2:ts+g2:cfi)q(~1)  20 
     3 Abc(~1)Fgf(~1)Bca(~-1+g1+g2+g2:cp)q(~-1+re:se)       15 
', header = TRUE, stringsAsFactors = FALSE) 
my.data 

Любой из этих двух результатов было бы полезно:

desired.result1 <- read.table(text = ' 
    my.num      my.string   my.cov 
     1 Bca(~-1+g1+g2:ti+g2:cfi+g2:pp+g2:cp)  10 
     2 Bca(~-1+g1+g2:ti+g2:pr+g2:ts+g2:cfi)  20 
     3 Bca(~-1+g1+g2+g2:cp)      15 
', header = TRUE, stringsAsFactors = FALSE) 
desired.result1 

desired.result2 <- read.table(text = ' 
    my.num      my.string  my.cov 
     1 ~-1+g1+g2:ti+g2:cfi+g2:pp+g2:cp  10 
     2 ~-1+g1+g2:ti+g2:pr+g2:ts+g2:cfi  20 
     3 ~-1+g1+g2+g2:cp      15 
', header = TRUE, stringsAsFactors = FALSE) 
desired.result2 

Я так ржавый на regex Я даже не уверен, с чего начать и не мог найти аналогичный вопрос в Интернете. Благодарим вас за любые советы или помощь.

+1

раскол на "(", получить третий, убираю – zx8754

+0

Может там быть вложенными круглыми скобками? –

+0

[Это может быть полезно] (http://stackoverflow.com/questions/8613237/extract-info-inside-all-paren тезис-в-r) – Sotos

ответ

3

Первое выражение:

sub(".*?\\(.*?\\).*?\\(.*?\\)(.*?\\(.*?\\)).*", "\\1", my.data$my.string) 
[1] "Bca(~-1+g1+g2:ti+g2:cfi+g2:pp+g2:cp)" "Bca(~-1+g1+g2:ti+g2:pr+g2:ts+g2:cfi)" 
[3] "Bca(~-1+g1+g2+g2:cp)" 

Второе выражение:

sub(".*?\\(.*?\\).*?\\(.*?\\).*?\\((.*?)\\).*", "\\1", my.data$my.string) 
[1] "~-1+g1+g2:ti+g2:cfi+g2:pp+g2:cp" "~-1+g1+g2:ti+g2:pr+g2:ts+g2:cfi" "~-1+g1+g2+g2:cp" 
4

Использование strsplit:.

sapply(strsplit(my.data$my.string, split = "(", fixed = TRUE), function(i){ 
    strsplit(i[4], split = ")", fixed = TRUE)[[1]][1]}) 

# [1] "~-1+g1+g2:ti+g2:cfi+g2:pp+g2:cp" "~-1+g1+g2:ti+g2:pr+g2:ts+g2:cfi" "~-1+g1+g2+g2:cp" 
+2

или это 'paste0 (sapply (strsplit (my.data $ my.string, '\\)'), '[', 3), ')')', чтобы получить первый – Sotos