Удаление текста внутри скобки из определенных строк в фрейме данных

#r #dataframe

Вопрос:

Итак, это мой образец фрейма данных

 dput(aa)
structure(list(V4 = structure(1:22, .Label = c("Peak228404", 
"Peak228411", "Peak228413", "Peak228423", "Peak228424", "Peak228439", 
"Peak228461", "Peak228476", "Peak228479", "Peak228495", "Peak228528", 
"Peak228553", "Peak228603", "Peak228612", "Peak228629", "Peak228630", 
"Peak228642", "Peak228651", "Peak228691", "Peak228740", "Peak4983", 
"Peak5261"), class = "factor"), annotation = structure(c(1L, 
4L, 5L, 1L, 1L, 1L, 6L, 8L, 1L, 1L, 1L, 1L, 1L, 1L, 8L, 8L, 8L, 
8L, 7L, 8L, 2L, 3L), .Label = c("Distal Intergenic", "Downstream (1-2kb)", 
"Downstream (2-3kb)", "Exon (ENST00000370460.6/2334, exon 16 of 21)", 
"Exon (ENST00000370460.6/2334, exon 21 of 21)", "Exon (ENST00000616857.4/84548, exon 3 of 3)", 
"Exon (ENST00000620118.4/ENST00000620118.4, exon 3 of 4)", "Promoter"
), class = "factor"), Output_required = structure(c(1L, 5L, 5L, 
1L, 1L, 1L, 5L, 6L, 1L, 1L, 1L, 1L, 1L, 1L, 6L, 6L, 6L, 6L, 4L, 
6L, 2L, 3L), .Label = c("Distal Intergenic", "Downstream (1-2kb)", 
"Downstream (2-3kb)", "Exon", "Exon ", "Promoter"), class = "factor")), class = "data.frame", row.names = c(NA, 
-22L))
 

Этот

  V4                                              annotation    Output_required
1  Peak228404                                       Distal Intergenic  Distal Intergenic
2  Peak228411            Exon (ENST00000370460.6/2334, exon 16 of 21)              Exon 
3  Peak228413            Exon (ENST00000370460.6/2334, exon 21 of 21)              Exon 
4  Peak228423                                       Distal Intergenic  Distal Intergenic
5  Peak228424                                       Distal Intergenic  Distal Intergenic
6  Peak228439                                       Distal Intergenic  Distal Intergenic
7  Peak228461             Exon (ENST00000616857.4/84548, exon 3 of 3)              Exon 
8  Peak228476                                                Promoter           Promoter
9  Peak228479                                       Distal Intergenic  Distal Intergenic
10 Peak228495                                       Distal Intergenic  Distal Intergenic
11 Peak228528                                       Distal Intergenic  Distal Intergenic
12 Peak228553                                       Distal Intergenic  Distal Intergenic
13 Peak228603                                       Distal Intergenic  Distal Intergenic
14 Peak228612                                       Distal Intergenic  Distal Intergenic
15 Peak228629                                                Promoter           Promoter
16 Peak228630                                                Promoter           Promoter
17 Peak228642                                                Promoter           Promoter
18 Peak228651                                                Promoter           Promoter
19 Peak228691 Exon (ENST00000620118.4/ENST00000620118.4, exon 3 of 4)               Exon
20 Peak228740                                                Promoter           Promoter
21   Peak4983                                      Downstream (1-2kb) Downstream (1-2kb)
22   Peak5261                                      Downstream (2-3kb) Downstream (2-3kb)
 

Таким образом, в этом фрейме данных в столбце, называемом аннотацией, есть строка, содержащая строку Exon, поэтому в каждой скобке есть текст, который мне не нужен, так как я хочу, чтобы он был согласованным, а это Exon только. Я добавил еще один столбец Output_required , который является моим желаемым конечным результатом.

Любое предложение или помощь будут очень признательны.

Ответ №1:

Удалите все 'Exon' , что может быть написано после, с помощью регулярного выражения lookbehind.

 sub('(?<=Exon).*', '', aa$annotation, perl = TRUE)

# [1] "Distal Intergenic"  "Exon"               "Exon"               "Distal Intergenic" 
# [5] "Distal Intergenic"  "Distal Intergenic"  "Exon"               "Promoter"          
# [9] "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic" 
#[13] "Distal Intergenic"  "Distal Intergenic"  "Promoter"           "Promoter"          
#[17] "Promoter"           "Promoter"           "Exon"               "Promoter"          
#[21] "Downstream (1-2kb)" "Downstream (2-3kb)"
 

Точно stringr::str_remove так же можно использовать и другие.

 stringr::str_remove(aa$annotation, '(?<=Exon).*')
 

Комментарии:

1. большое вам спасибо, как всегда, за ответы несколькими способами

2. это сработало F1$аннотация <- как.данные.фрейм(sub(‘(?

3. Однако вы можете избежать использования as.data.frame . aa$annotation <- sub('(?<=Exon).*', '', aa$annotation, perl = TRUE) должно сработать.

4. позвольте мне запустить это работает

Ответ №2:

Еще один способ достичь своей цели-использовать обратную связь:

 sub("(Exon)(.*)", "\1", aa$annotation)
 

Здесь мы разделяем строки на две группы захвата:

  • (Exon) : эта группа буквально захватывает Exon
  • (.*) : эта группа захватывает все остальное
  • \1 : эта обратная ссылка, используемая в аргументе замены to sub , «запоминает» первую группу захвата, но не вторую, тем самым эффективно удаляя ее!

Ответ №3:

Мы можем использовать trimws от base R

 trimws(aa$annotation, whitespace = "(?<=Exon).*")
[1] "Distal Intergenic"  "Exon"               "Exon"               "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic"  "Exon"              
 [8] "Promoter"           "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic"  "Distal Intergenic" 
[15] "Promoter"           "Promoter"           "Promoter"           "Promoter"           "Exon"               "Promoter"           "Downstream (1-2kb)"
[22] "Downstream (2-3kb)"