Как правильно разобрать таблицу в HTML-файле с помощью R

#html #r #html-table #tidyverse

Вопрос:

У меня есть следующий HTML-файл, доступный отсюда:

https://dpaste.org/oGQG

Я попробовал следующий код:

 library(tidyverse)

html_file <- "my_html_file.html"

html <- xml2::read_html(html_file,
                        encoding = "UTF-8",
                        options = "RECOVER",
                        warn = FALSE, verbose = TRUE)
html_res <- rvest::html_table(html, trim = FALSE)

df <- html_res[[1]]

df %>%
  janitor::clean_names() %>%
  dplyr::select(run_id, s_id, s_number, library, s_name, tissue)
 

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

 # A tibble: 26 x 6
   run_id                   s_id       s_number    library       s_name             tissue       
   <chr>                    <chr>      <chr>       <chr>         <chr>              <chr>        
 1 "210510_VH00236_65_AAAJ… "KS_=rn… "S1"        "KAPA_HMR"    "01_PaS_6h_0uM_1<… "Cervical MS…
 2 "210510_VH00236_65_AAAJ… "KS_002"   "S2"        "K=rnAPA_H… "02_PaS_6h_0uM_2"  "Cervical MS…
 3 "210510_VH00236_65_AAAJ… "KS_003"   "S3"        "KAPA_HMR"    "Cervical MSC"     ""           
 4 "210510_VH00236_65_AAAJ… "KS_004"   "S4=rntd… "KAPA_HMR"    "04_PaS_6h_20uM_1" "Cervica=r…
 5 "210510_VH00=rn236_65… "KS_005"   "S5"        "KAPA_HMR=r… "05_PaS_6h_20uM_2" "Cervical MS…
 6 "210510_VH00236_65_AAAJ… "KS_006"   "S6"        "KAPA_HMR"    "06_PaS_6h=rn_2… "Cervical MS…
 7 "210510_VH00236_65=rn… "KS_008"   "S8"        "KAPA_HMR"    "08_PaS_6h_50uM_2" "Cervical MS…
 8 "210510_VH00236_65_AAAJ… "KS_=rn… "S9"        "KAPA_HMR"    "09_PaS_6h_50uM_3… "Cervical MS…
 9 "210510_VH00236_65_AAAJ… "KS_010"   "S10"       "KAPA_HMR"    "10_PaS_24h_0uM_1" "Cervical MS…
10 "210510_VH00236_65_AAA=… "KS_011"   "S11"       "KAPA_HMR"    "11_PaS_24h_0uM_2" "Cervical MS…
# … with 16 more rows
 

Обратите внимание, что он не проанализирован полностью. =rn В нем все еще содержится какая-то строка.
Как я могу решить эту проблему?

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

1. Как мы используем HTML-файл, который вы связали? Можете ли вы предоставить dput(df) вместо этого ?

2. @RonakShah После того, как вы перейдете по ссылке dpaste.org/oGQG . Вы можете скопировать текст Copy Snippet оттуда, вставить в редактор и сохранить как HTML. Я не могу использовать dput , потому что вывод будет слишком большим, чтобы помещать его сюда.

3. Когда я сохраняю этот фрагмент и просматриваю HTML, я вижу некоторые ошибки, которые вы хотите исправить в браузере. Например, в строке 3 таблицы отсутствует Read столбец, а другие записи сдвинуты влево. Эти ошибки содержатся в исходных данных, они не являются результатом анализа rvest::html_table .

Ответ №1:

Может быть, это только начало.

Удалены все вхождения 'rn' с < и = вместе с <a> тем, где < необязательно и td> . Основная задача состоит в том, чтобы выявить закономерности, которые не нужны в данных.

 library(dplyr)

df %>%
  janitor::clean_names() %>%
  dplyr::select(run_id, s_id, s_number, library, s_name, tissue) %>% 
  mutate(across(.fns = ~gsub('[rn<=]|<?a>|td>', '', .)))

#  run_id                      s_id   s_number library  s_name           tissue        
#   <chr>                       <chr>  <chr>    <chr>    <chr>            <chr>         
# 1 210510_VH00236_65_AAAJGJ5M5 KS_001 S1       KAPA_HMR 01_PaS_6h_0uM_1/ "Cervical MSC"
# 2 210510_VH00236_65_AAAJGJ5M5 KS_002 S2       KAPA_HMR 02_PaS_6h_0uM_2  "Cervical MSC"
# 3 210510_VH00236_65_AAAJGJ5M5 KS_003 S3       KAPA_HMR Cervical MSC     ""            
# 4 210510_VH00236_65_AAAJGJ5M5 KS_004 S4       KAPA_HMR 04_PaS_6h_20uM_1 "Cervical MSC"
# 5 210510_VH00236_65_AAAJGJ5M5 KS_005 S5       KAPA_HMR 05_PaS_6h_20uM_2 "Cervical MSC"
# 6 210510_VH00236_65_AAAJGJ5M5 KS_006 S6       KAPA_HMR 06_PaS_6h_20uM_3 "Cervical MSC"
# 7 210510_VH00236_65_AAAJGJ5M5 KS_008 S8       KAPA_HMR 08_PaS_6h_50uM_2 "Cervical MSC"
# 8 210510_VH00236_65_AAAJGJ5M5 KS_009 S9       KAPA_HMR 09_PaS_6h_50uM_3 "Cervical MSC"
# 9 210510_VH00236_65_AAAJGJ5M5 KS_010 S10      KAPA_HMR 10_PaS_24h_0uM_1 "Cervical MSC"
#10 210510_VH00236_65_AAAJGJ5M5 KS_011 S11      KAPA_HMR 11_PaS_24h_0uM_2 "Cervical MSC"
# … with 16 more rows
 

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

1. Спасибо. Но в третьей строке s_name значение смещено влево от ткани. Ему не удается проанализировать содержимое. Он должен содержать 03_PaS_6h_0uM_3 . Как я могу решить эту проблему?

2. Это не вытекает из моего кода. Это уже присутствует, когда вы делаете df %>% janitor::clean_names() %>% dplyr::select(run_id, s_id, s_number, library, s_name, tissue)

3. Я это понимаю. Это проблема с анализом из rvest::html_table() или xml2::read_html . Поэтому главный вопрос заключается в том, как правильно и чисто выполнить первоначальный анализ .

4. Извините, мне не было ясно, что это то, что вы искали в своем посте. Я думал, вы хотите убрать дополнительные тексты, с =rn которыми в нем.