Извлечь конкретное слово - PullRequest
1 голос
/ 05 марта 2019

У меня есть этот список объектов:

  dput(head(annotations))
    structure(list(X1 = c("KQ415659.1", "KQ415659.1", "KQ415659.1", 
    "KQ415659.1", "KQ415659.1", "KQ415659.1"), X2 = c("Genbank", 
    "Genbank", "Genbank", "Genbank", "Genbank", "Genbank"), X3 = c("exon", 
    "exon", "exon", "exon", "exon", "exon"), X4 = c(2986, 8779, 12123, 
    14982, 15303, 15780), X5 = c(3040, 8886, 12182, 15050, 15387, 
    15844), X6 = c(".", ".", ".", ".", ".", "."), X7 = c("+", "+", 
    "+", "+", "+", "+"), X8 = c(".", ".", ".", ".", ".", "."), X9 = c("transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028242mg\";", 
    "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028243mg\";", 
    "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028244mg\";", 
    "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028245mg\";", 
    "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028246mg\";", 
    "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028247mg\";"
    )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
    -6L))

Я хочу извлечь слово, начинающееся с «ICBIM» и заканчивающееся «mg» из всех строк.

# A tibble: 6 x 1
  X9                                                                          
<chr>
        1 "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028241mg\";"
        2 "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028242mg\";"
        3 "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028243mg\";"
        4 "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028244mg\";"
        5 "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028245mg\";"
        6 "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028246mg\";"

Ответы [ 4 ]

2 голосов
/ 05 марта 2019

Соответствие регулярному выражению в R немного странно.У вас есть 6 функций (grep, grepl, sub, gsub, regexpr, gregepr, regexec), выполняющих связанные вещи, но ни одна из них не возвращает фактическую строку.Самое близкое, что вы можете получить, это список позиций и длин совпадений (например) regexpr, которые можно передать в regmatches, чтобы получить строки.

Итак, вот как я бы это сделал:

your_data = c("transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028241mg\";", "transcript_id \"rna0\"; gene_id \"gene0\"; gene_name \"ICBIM_22028242mg\";")
matches = regexpr("ICBIM.*mg", your_data)
regmatches(your_data, matches)
[1] "ICBIM_22028241mg" "ICBIM_22028242mg"
1 голос
/ 05 марта 2019

Вы можете использовать это регулярное выражение в sub:

sub(".*\\b(ICBIM.+mg)\\b.*", "\\1", annotations$X9)
# [1] "ICBIM_22028242mg" "ICBIM_22028243mg" "ICBIM_22028244mg" "ICBIM_22028245mg"
# [5] "ICBIM_22028246mg" "ICBIM_22028247mg"

Здесь \\b обозначает границу слова.

0 голосов
/ 05 марта 2019

Предполагая, что формат строк одинаков, без regex :

substring(annotations$X9, 51, 66)
# [1] "ICBIM_22028242mg" "ICBIM_22028243mg" "ICBIM_22028244mg" "ICBIM_22028245mg" "ICBIM_22028246mg" "ICBIM_22028247mg"

read.fwf(textConnection(annotations$X9), widths = c(50, 16), stringsAsFactors = FALSE)[, 2]
# [1] "ICBIM_22028242mg" "ICBIM_22028243mg" "ICBIM_22028244mg" "ICBIM_22028245mg" "ICBIM_22028246mg" "ICBIM_22028247mg"
0 голосов
/ 05 марта 2019

начинается с «ICBIM» и заканчивается «mg»

ICBIM.+?mg

См. Демонстрационное выражение регулярных выражений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...