Лучше потратить немного больше времени, чтобы идти вверх по течению и фиксировать информацию в таблице. В этом примере используется пакет XML
, потому что, как указано в этом сообщении в блоге , функция XML::readHTMLTable
имеет параметр skip
, которого html_table
, по-видимому, нет ...
Чтение необработанного HTML:
urlname <- "https://www.hockey-reference.com/leagues/NHL_2018_skaters.html"
rr <- readLines(urlname)
Первая попытка чтения: заголовок + пропуск строки 1
library(XML)
h1 <- readHTMLTable(rr, header=TRUE,skip=1)$stats
В данных разбросаны неверные (не числовые) строки, которые, очевидно, являются дополнительными внутренними строками «заголовка». Определите функцию, чтобы найти их:
br <- function(i,x=h1) {
suppressWarnings(which(is.na(as.numeric(as.character(x[[i]])))))
}
badrows <- br(1)
Попробуйте еще раз, пропустив «плохие» строки:
h2 <- readHTMLTable(rr, header=TRUE,skip=c(1,badrows+1))$stats
Определить числовые столбцы как все, кроме этих 4:
numcols <- setdiff(names(h2),c("Player", "Tm", "Pos", "ATOI"))
Преобразовать столбцы, которые должны быть числовыми:
for (i in numcols) {
h2[[i]] <- as.numeric(as.character(h2[[i]]))
}