очистить таблицу с Rvest в R, который имеет несоответствие заголовка таблицы - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь почистить эту таблицу, которая кажется очень простой. Вот 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), чтобы убрать верхнюю строку, которая говорит, что я не могу, потому что это список. Очень бы хотелось выяснить, как это сделать.

1 Ответ

1 голос
/ 15 февраля 2020

Вот одно из решений. Объяснение следует.

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
...