Добавьте столбец к каждой таблице, пока мы будем перебирать с помощью rvest. - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь почистить последние пять дат на этой веб-странице .Здесь у меня есть seq_dates_test (последовательность дат, которые я хочу очистить на этой веб-странице):

structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")

Я использую приведенный ниже фрагмент кода, чтобы успешно очистить эти даты

url <- "http://mcsafetyfeed.org/incidents.php?date="

url %>% 
  map2_chr(seq_dates_test,paste0) %>% 
  map_df(. %>% 
    read_html() %>% 
      html_nodes("table") %>% 
    html_table(header = TRUE) %>%
    # Extract out first element of list
    magrittr::extract2(1)
    )

Однако я бы хотел mutate столбец Date для каждой таблицы (соответствующий каждой дате).Я пытался добавить mutate(Date = seq_dates_test) после extract2, но я получаю эту ошибку ...

Ошибка в mutate_impl (.data, dots): столбец Date должен иметь длину285 (количество строк) или одна, а не 5



ОБНОВЛЕНИЕ: Как бы я изменил свой код так, чтобы, если таблица X была длиной 0, я пропустил эту таблицу и переместилсяна чистку следующего стола?

Ответы [ 2 ]

1 голос
/ 25 марта 2019

paste векторизовано, поэтому нам не нужно делать map2.Мы можем напрямую paste 'url' с датами и извлечь таблицу и использовать .id для создания столбца 'Date' с именем vector

library(tidyverse)
out <- map_df(set_names(paste0(url, seq_dates_test), seq_dates_test), ~
      .x %>% 
         read_html() %>% 
         html_nodes("table") %>% 
         html_table(header = TRUE) %>%    
         magrittr::extract2(1), .id = 'Date')

dim(out)
#[1] 1365    6

head(out)
#        Date     Time                                                         Event                               Address     Responding Agency
#1 2019-03-20 23:51:00                                             Parking complaint              1398 DEWEY AV, Rochester Rochester City Police
#2 2019-03-20 23:12:00 Dangerous condition - no immediate danger to life or property        2970 W HENRIETTA RD, Henrietta  Monroe County Police
#3 2019-03-20 22:50:00                                                 Odor of smoke          2349 E RIDGE RD, Irondequoit     Ridge Culver Fire
#4 2019-03-20 22:44:00                                           Dangerous condition          DENISE RD/LAKE AV, Rochester Rochester City Police
#5 2019-03-20 22:00:00                                             Parking complaint               3150 W RIDGE RD, Greece         Greece Police
#6 2019-03-20 21:58:00           Accident of motor vehicles involving unknown injury SB RT 590 AT BROWNCROFT BL, Rochester New York State Police
#       Event ID
#1 CTYP190793429
#2 MCOP190793334
#3 RCUF190793284
#4 CTYP190793264
#5 GREP190793188
#6 NYSP190793186

Update

Если нам необходимо выполнить проверку на наличие ошибок и вернуть значение по умолчанию, можно использовать tryCatch или possibly из purrr

f1 <- function(x) {
        x %>%
           read_html() %>% 
           html_nodes("table") %>% 
           html_table(header = TRUE) %>%    
           magrittr::extract2(1)


}            
pos1 <- possibly(f1, otherwise = NULL, quiet = TRUE)

outlst1 <- map(set_names(paste0(url, seq_dates_test), 
                  seq_dates_test), pos1, .id = 'Date')

, а затем отфильтровать NULLэлементы

bind_rows(discard(outlst1, is.null))

данные

seq_dates_test <- structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")
url <- "http://mcsafetyfeed.org/incidents.php?date="
0 голосов
/ 25 марта 2019

Небольшое изменение в вашем потоке, так как мы хотим добавить новый столбец Date для каждого фрейма данных, который мы можем map сверх seq_dates_test вместо вставленных URL-адресов.

library(rvest)

map(seq_dates_test, function(x) 
         paste0(url, x) %>%
               read_html() %>% 
               html_nodes("table") %>% 
               html_table(header = TRUE) %>%
               magrittr::extract2(1) %>%
               mutate(Date = x))

Данные

seq_dates_test <- structure(c(17975, 17976, 17977, 17978, 17979), class = "Date")
url <- "http://mcsafetyfeed.org/incidents.php?date="
...