Ошибка при попытке преобразовать список в фрейм данных с помощью ldply (Ошибка в (function (..., row.names = NULL,: аргументы подразумевают различное количество строк:) - PullRequest
3 голосов
/ 26 марта 2020

Я пытаюсь проверить стандартную статистику игроков, играющих за футбольные команды, используя RStudio. Я могу извлечь информацию в списки, но не могу визуализировать их как фреймы данных, это дает мне эту ошибку (Ошибка в (функция (..., row.names = NULL, check.rows = FALSE, check.names) = TRUE,: аргументы подразумевают различное количество строк: 33, 27, 24, 35, 5, 4, 54, 38, 18, 2, 1) Я - настоящий нуб в R и не могу придумать, как Чтобы решить ее, вот код, который я использую, и страница, с которой я пытаюсь извлечь данные, любая помощь очень приветствуется !!!

https://fbref.com/en/squads/2b390eca/2016-2017/Athletic-Bilbao

install.packages('rvest')
install.packages('plyr')
install.packages('dplyr')
library(rvest)
library(plyr)
library(dplyr)

years = c(2017:2018)
urls = list()
for (i in 1:length(years)) {
  url = paste0('https://fbref.com/en/squads/2b390eca/',years[i],'-',years[i+1],'/Athletic-Bilbao')
  urls[[i]] = url #https://fbref.com/en/squads/d5348c80/',years1[i],'-',years2[i+1],'/AEK-Athens
}


tbl = list()
years = 2017
j = 1
for (j in seq_along(urls)) {
  tbl[[j]] = urls[[j]] %>%
    read_html() %>%
    html_nodes("table") %>%
    html_table()
  tbl[[j]]$Year = years
  j = j+1
  years = years+1
}

Data = ldply(tbl,data.frame)

1 Ответ

1 голос
/ 27 марта 2020

Я вижу два исправления, которые необходимы.

Ваш второй URL неверен. Вы хотите, я думаю, years[i] + 1 т.е. переместить + 1 вне индексации. Затем вы получаете 2017-2018 и 2018-19.

Во-вторых, существует множество таблиц с различным количеством строк и столбцов, и вы пытаетесь объединить их все, когда вам нужен только первый (стандартный). Если вам нужна только первая таблица, используйте html_node вместо html_nodes, т.е. html_node("table").

Я также не уверен, настроен ли столбец года таким образом, чтобы вы работали так, как вы в настоящее время получите 2019 и 2020 годы. Я изменился, чтобы вы получили 2017 и 2018. Вам не нужно приращение j между прочим.

library(rvest)
library(plyr)
library(dplyr)

years = c(2017:2018)
urls = list()

for (i in 1:length(years)) {
  url = paste0('https://fbref.com/en/squads/2b390eca/',years[i],'-',years[i] + 1,'/Athletic-Bilbao')
  urls[[i]] = url 
}

tbl = list()

for (j in seq_along(urls)) {
  tbl[[j]] <- urls[[j]] %>%
              read_html() %>%
              html_node("table") %>%
              html_table()
  tbl[[j]]$Year = years[j]
}

data = ldply(tbl,data.frame)
...