таблица переформатирования в R - PullRequest
1 голос
/ 15 января 2020

Я работаю над извлечением информации из таблицы на веб-сайте. Вывод таблицы выглядит следующим образом (см. Ниже).

1. Saturday
2. 4:00 PM
3. 5:30 PM
4. Sunday
5. 8:30 AM
6. 10:00 AM

Мне действительно нужно, чтобы это проходило вот так (см. Ниже). Я не думаю, что смогу преобразовать его с помощью функции html_table(), но я надеялся, что кто-то знает, как переформатировать его после факта в R.

1. Saturday    4:00 PM
2. Saturday    5:30 PM
3. Sunday      8:30 AM
4. Sunday      10:00 AM

Вот код, который я использую:

urls <- 'https://www.life.church/edmond/'

times <- function(x){ 
  try( x %>%
         read_html()%>%
         html_table(header = F)%>%
         data.frame(x))

}


#Apply function to the urls
m <- lapply(urls, times)

#Convert to a dataframe 
data <-data.frame(unnest(tibble(m)))

1 Ответ

1 голос
/ 15 января 2020

Вот что я бы сделал:

library(dplyr)
library(xml2)
library(rvest)
library(tidyr)
library(purrr)

times <- function(x){ 
  try(
    x %>%
      read_html() %>%
      html_table(header = FALSE) %>% 
      flatten() %>% 
      as_tibble()
  )
}

urls <- c('https://www.life.church/edmond/', 'https://www.life.church/fortworth/')

lapply(urls, times) %>% 
  set_names(urls) %>% 
  bind_rows(.id = "URL") %>% 
  separate(X1, into = c("Time", "Day"), sep = "(?=^\\D)") %>% 
  fill(Day) %>% 
  filter(Time != "") %>% 
  select(URL, Day, Time)
# A tibble: 16 x 3
   URL                                Day       Time    
   <chr>                              <chr>     <chr>   
 1 https://www.life.church/edmond/    Saturday  4:00 PM 
 2 https://www.life.church/edmond/    Saturday  5:30 PM 
 3 https://www.life.church/edmond/    Sunday    8:30 AM 
 4 https://www.life.church/edmond/    Sunday    10:00 AM
 5 https://www.life.church/edmond/    Sunday    11:30 AM
 6 https://www.life.church/edmond/    Sunday    1:00 PM 
 7 https://www.life.church/edmond/    Sunday    4:00 PM 
 8 https://www.life.church/edmond/    Sunday    5:30 PM 
 9 https://www.life.church/edmond/    Wednesday 7:00 PM 
10 https://www.life.church/fortworth/ Saturday  4:00 PM 
11 https://www.life.church/fortworth/ Saturday  5:30 PM 
12 https://www.life.church/fortworth/ Sunday    8:30 AM 
13 https://www.life.church/fortworth/ Sunday    10:00 AM
14 https://www.life.church/fortworth/ Sunday    11:30 AM
15 https://www.life.church/fortworth/ Sunday    1:00 PM 
16 https://www.life.church/fortworth/ Wednesday 7:00 PM

separate() использует регулярное выражение упреждения для разделения записей, которые не начиная с ди git в новый столбец Day

...