Неожиданное поведение gsub в R - PullRequest
0 голосов
/ 13 февраля 2019

Извините, что не уточнил название, но я не знаю, как объяснить это без примера.

У меня есть файл .html, который выглядит следующим образом:

<TR><TD>log p-value:</TD><TD>-2.797e+02</TD></TR>
<TR><TD>Information Content per bp:</TD><TD>1.736</TD></TR>
<TR><TD>Number of Target Sequences with motif</TD><TD>894.0</TD></TR>
<TR><TD>Percentage of Target Sequences with motif</TD><TD>47.58%</TD></TR>
<TR><TD>Number of Background Sequences with motif</TD><TD>10864.6</TD></TR>
<TR><TD>Percentage of Background Sequences with motif</TD><TD>22.81%</TD></TR>
<TR><TD>Average Position of motif in Targets</TD><TD>402.4 +/- 261.2bp</TD></TR>
<TR><TD>Average Position of motif in Background</TD><TD>400.6 +/- 246.8bp</TD></TR>
<TR><TD>Strand Bias (log2 ratio + to - strand density)</TD><TD>-0.0</TD></TR>
<TR><TD>Multiplicity (# of sites on avg that occur together)</TD><TD>1.48</TD></TR>

Я прочитал это в:

html = readLines("file.html")

Меня интересует, что находится между </TD><TD> и </TD></TR>.Когда я запускаю следующее, я получаю нужный результат:

mypattern = '<TR><TD>log p-value:</TD><TD>([^<]*)</TD></TR>'
gsub(mypattern,'\\1',grep(mypattern,html,value=TRUE))
[1] "-2.797e+02"

Он работает хорошо почти для всех строк, которые я хочу сопоставить, но когда я делаю то же самое для последних двух строк, он неизвлечь что-нибудь.

mypattern = '<TR><TD>Strand Bias (log2 ratio + to - strand density)</TD><TD>([^<]*)</TD></TR>'
gsub(mypattern,'\\1',grep(mypattern,html,value=TRUE))
character(0)

mypattern = '<TR><TD>Multiplicity (# of sites on avg that occur together)</TD><TD>([^<]*)</TD></TR>'
gsub(mypattern,'\\1',grep(mypattern,html,value=TRUE))
character(0)

Почему это происходит?Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Если ваша структура данных действительно такая.У вас есть xml-файл с ключами и значениями, поэтому я предполагаю, что это проще использовать!

library(xml2)
xd <- read_xml("file.html", as_html = TRUE)
key_values <- xml_text(xml_find_all(xd, "//td"))
is_key <- as.logical(seq_along(key_values) %% 2)
setNames(key_values[!is_key], key_values[is_key])
0 голосов
/ 13 февраля 2019

Во-первых, я скажу, что на самом деле решил бы эту проблему следующим образом:

gsub(".+>([^<]+)</TD></TR>", "\\1", html)
#>  [1] "-2.797e+02"        "1.736"             "894.0"            
#>  [4] "47.58%"            "10864.6"           "22.81%"           
#>  [7] "402.4 +/- 261.2bp" "400.6 +/- 246.8bp" "-0.0"             
#> [10] "1.48"

Но, чтобы ответить на вопрос, почему ваш путь не сработал, нам нужно проверить файл справки.для регулярных выражений R (help("regex")):

Любой метасимвол со специальным значением может быть заключен в кавычки, если ему предшествует обратная косая черта.Метасимволы в расширенных регулярных выражениях\ |() [{^ $ * +?...

Шаблоны, с которыми у вас возникли проблемы с включенными круглыми скобками, которые вам нужно было исключить (обратите внимание на двойной обратный слеш, поскольку сами обратные слэши необходимо экранировать):

mypattern = '<TR><TD>Multiplicity \\(# of sites on avg that occur together\\)</TD><TD>([^<]*)</TD></TR>'
gsub(mypattern,'\\1',grep(mypattern,html,value=TRUE))
# [1] "1.48"
...