Установка имен df с символьным вектором различной длины - PullRequest
2 голосов
/ 18 октября 2019

У меня проблемы с установкой имен для df, которые я удалил с веб-сайта. У html_table есть группа столбцов, которые не имеют правильных имен столбцов. Когда я перехожу к использованию purrr::set_names, я получаю сообщение об ошибке, поскольку столбцы очищены, имеют длину, отличную от длины столбцов html_table. Есть ли способ решить эту проблему, о котором каждый может подумать? Отсутствующий набор столбцов представляется дублирующими данными. Они идентичны столбцам 5:10 в data. Пример ниже:

library(tidyverse)
# url
url <- "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?hand=&reportType=avg&prp=P&month=&year=2019&pitch=FS&ds=&lim=0"

# get page from URL
page <-
  url %>%
  xml2::read_html()

# get df from page
data <-
  page %>%
  rvest::html_table(fill = TRUE) %>%
  .[[2]] %>%
  data.frame(stringsAsFactors = FALSE) %>%
  tbl_df()

# get column names
names <-
  page %>%
  rvest::html_node("thead") %>%
  rvest::html_nodes("th") %>%
  rvest::html_text() %>%
  stringr::str_trim()

# Add Column names since Scrape does not include
df <-
  data %>%
  purrr::set_names(names)
#> `nm` must be `NULL` or a character vector the same length as `x`
Created on 2019-10-18 by the reprex package (v0.3.0)

1 Ответ

0 голосов
/ 18 октября 2019

Проблема в том, что length из names не соответствует количеству столбцов «данных». Согласно ?set_names

set_names (x, nm = x, ...)

x- Vector to name.

... - Векторимена, той же длины, что и x.

Поскольку для этого требуется тот же length, и здесь это не так, он выдает ошибку.

Один из вариантов - использовать rename_at. Если мы знаем индекс положения столбца или имена столбцов, передайте его в vars из rename_at и измените имена столбцов

library(dplyr)
data %>%
     rename_at(seq_len(length(names)), ~ names)
...