изстържете таблица с 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