очистить таблицу с помощью rvest в R, у которого есть несовпадающий заголовок таблицы

Я пытаюсь очистить эту таблицу, и кажется, что это было бы очень просто. Вот URL-адрес таблицы: https://fantasy.nfl.com/research/scoringleaders?position=1&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1

Вот что я закодировал:

url <- "https://fantasy.nfl.com/research/scoringleaders?position=1&sort=pts&statCategory=stats&statSeason=2019&statType=weekStats&statWeek=1"
x = data.frame(read_html(url) %>% 
  html_nodes("table") %>% 
  html_table())

Это работает нормально, но дает действительно странные заголовки из двух строк, и когда я пытаюсь добавить%>% slice (-1), чтобы удалить верхнюю строку, он говорит, что я не могу, потому что это список. Очень хотелось бы разобраться, как это сделать.


person Jeff Henderson    schedule 15.02.2020    source источник
comment
Прямо сейчас на выходе получается список. Вы хотите преобразовать его во фрейм данных. html_table() %>% as.data.frame преобразует список в фрейм данных. Затем вы можете использовать slice (), если хотите.   -  person jazzurro    schedule 15.02.2020


Ответы (1)


Вот одно решение. Далее следует объяснение.

library(rvest)
library(tidyverse)

read_html(url) %>% 
  html_nodes("table") %>%  
  html_table(header = T) %>%
  simplify() %>% 
  first() %>% 
  setNames(paste0(colnames(.), as.character(.[1,]))) %>%
  slice(-1) 

Вывод glimpse():

Observations: 25
Variables: 16
$ Rank          <chr> "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"…
$ Player        <chr> "Lamar Jackson QB - BAL", "Dak Prescott QB - DAL", "Deshaun W…
$ Opp           <chr> "@MIA", "NYG", "@NO", "@ARI", "@JAX", "@PHI", "PIT", "WAS", "…
$ PassingYds    <chr> "324", "405", "268", "385", "378", "380", "341", "313", "248"…
$ PassingTD     <chr> "5", "4", "3", "3", "3", "3", "3", "3", "3", "3", "2", "2", "…
$ PassingInt    <chr> "-", "-", "1", "-", "-", "-", "-", "-", "-", "1", "1", "1", "…
$ RushingYds    <chr> "6", "12", "40", "22", "2", "-", "-", "5", "24", "6", "13", "…
$ RushingTD     <chr> "-", "-", "1", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ ReceivingRec  <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ ReceivingYds  <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ ReceivingTD   <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ RetTD         <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ MiscFumTD     <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ Misc2PT       <chr> "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "1", "-", "…
$ FumLost       <chr> "-", "-", "-", "1", "-", "-", "-", "-", "-", "-", "-", "-", "…
$ FantasyPoints <chr> "33.56", "33.40", "30.72", "27.60", "27.32", "27.20", "25.64"…

Объяснение
Из ?html_table документов:

html_table в настоящее время делает несколько предположений:

  • Ячейки не занимают несколько строк
  • Заголовки находятся в первой строке

Частично ваша проблема решается установкой header = TRUE в html_table().

Другая часть проблемы состоит в том, что ячейки заголовка занимают две строки, чего html_table() не ожидает.

Предполагая, что вы не хотите терять информацию ни в одной строке заголовка, вы можете:

  1. Используйте simplify и first, чтобы вытащить фрейм данных из списка, полученного от html_table
  2. Используйте setNames, чтобы объединить две строки заголовка (которые теперь являются столбцами фрейма данных и первой строкой)
  3. Удалите первую строку (теперь избыточную) с slice
person andrew_reece    schedule 15.02.2020