Создание фрейма данных из плохо сохраненных данных списка (удаление первой строки, которая является ненужной)

#r #list

#r #Список

Вопрос:

Наш профессор продолжает давать нам задания для работы в R, но вместо того, чтобы предоставлять нам более простые данные, которые мы обычно должны извлекать из Интернета.

Этот блок кода выполняет это:

 library(rvest)
url <- "https://www.supremecourt.gov/opinions/slipopinion/18"
page <- read_html(url)
table <- html_table(page, fill = FALSE, trim = TRUE)
  

Однако это также включается в данные таблицы:

таблица [[1]] X1 1 СОВЕТЫ ПО ПОИСКУ r n Слишком короткий поисковый запрос r n Недопустимый текст в поисковом запросе. Повторите попытку X2 1 РАСШИРЕННЫЙ ПОИСК В DOCKET SEARCH

Итак, мне трудно понять, как форматировать эти данные во фрейм данных, потому что выполнение чего-то вроде as.data.frame(table) выдает мне эту ошибку,

Ошибка в (function (…, row.names = NULL, проверьте.rows = FALSE, check.names = TRUE, : аргументы подразумевают разное количество строк: 1, 11, 8, 7, 2

Комментарии:

1. Ваш профессор делает вам одолжение, данные реального мира в беспорядке 🙂 Предполагая, что вам нужна таблица за каждый месяц, возможно, было бы лучше получить таблицы с помощью html_nodes("table") селектора для нужных таблиц перед использованием html_table .

Ответ №1:

Вы можете использовать селектор, чтобы отличать таблицы с данными от других таблиц на странице, таких как окно поиска. В этом случае таблицы данных имеют класс table-bordered :

 page %>% 
  html_nodes("table.table-bordered") %>% 
  html_table()
  

Ответ №2:

Я думаю, мы можем подойти к этому двумя способами. Если вы уверены, что возникает только ошибка первого типа, вы можете выполнить поиск Search term too short по grepl и исключить любой элемент из списка table перед выполнением bind_rows .

 library(dplyr)
table[unlist(lapply(
  table, 
  function(x) sum(grepl("Search term too short", x))
)) < 1] %>% 
  bind_rows()
  

В противном случае, поскольку другие «приятные» элементы списка имеют одинаковые имена столбцов / формат, вы также можете использовать это.

 table[unlist(lapply(
  table, 
  function(x) sum(grepl("Docket", names(x))) > 0
))] %>% 
  bind_rows()
  

Комментарии:

1. Большое вам спасибо! Это помогло, я понимаю unlist и bindrows, но функция (x) sum … для меня это не имеет смысла, но я предполагаю, что она фильтрует данные для выбора из таблицы?

2. @BaileyMiller Он sum существует, потому что grepl выполняется на нескольких элементах. Вы можете попробовать разложить их по порядку, чтобы посмотреть, что они делают!