#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
выполняется на нескольких элементах. Вы можете попробовать разложить их по порядку, чтобы посмотреть, что они делают!