Манипулирование двумя символами в URL с пакетом purrr для очистки - PullRequest
0 голосов
/ 27 мая 2018

У меня возникают трудности при написании функции очистки с помощью пакета purrr (впервые).Я хочу очистить несколько страниц, изменив два символа назначенного URL.Следующий код работает только для одного сезона данных футболистов.

page_func <- function(page) {

  cat(".")

  df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-2017-2018/nach-name/", 
                         page)) %>%
    html_nodes("table") %>%
    html_table() %>%
    as.data.frame() %>%
    as.tbl() %>%
    select(Speler, Team, Geboren, Lengte, Positie) %>%
    add_column(seizoen = "2017-2018")

}

raw_seizoen_17_18 <- map_df(1:11, page_func) 

Вывод:

# A tibble: 541 x 6
   Speler           Team             Geboren    Lengte Positie seizoen  
   <chr>            <chr>            <chr>      <chr>  <chr>   <chr>    
 1 Amir Absalem     FC Groningen     19.06.1997 ???    VD      2017-2018
 2 Asumah Abubakar  Willem II        10.05.1997 183 cm AV      2017-2018
 3 Ragnar Ache      Sparta Rotterdam 28.07.1998 182 cm AV      2017-2018
 4 Marouane Afaker  SBV Excelsior    09.05.1999 ???    AV      2017-2018
 5 Gor Agbaljan     Heracles Almelo  25.04.1997 183 cm MV      2017-2018
 6 Thomas Agyepong  NAC Breda        10.10.1995 168 cm AV      2017-2018

Теперь я хочу очистить все сезоны от 1956-1957 до 2017-2018 в одномфункции, но я пока не могу понять, как манипулировать этими двумя переменными с помощью purrr.

page_season_func <- function(seizoen, page) {

  cat(".")

  df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-", 
                         seizoen, 
                         "/nach-name/", 
                         page)) %>%
    html_nodes("table") %>%
    html_table() %>%
    as.data.frame() %>%
    as.tbl() %>%
    select(Speler, Team, Geboren, Lengte, Positie) %>%
    add_column(year = seizoen)

}

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы можете использовать map2_dfr с тегом .id, чтобы указать год в выходных данных:

page_span <- 1:11
year_span <- 1956:1958
years <- sort(rep(year_span, length(page_span)))
names(years) <- years # need to name years for .id to work
pages <- rep(page_span, length(year_span))
map2_dfr(years, pages, page_season_func, .id="year")

Вывод:

# A tibble: 6 x 6
  year  Speler             Team          Geboren   Lengte Positie
  <chr> <chr>              <chr>         <chr>     <chr>  <chr>  
1 1956  Sjeng Adang        Roda JC Kerk… 04.07.19… ???    MV     
2 1956  Wim Anderiesen jr. AFC Ajax      02.09.19… ???    VD     
3 1956  Wim Andriesen      AFC Ajax      09.02.19… ???    MV     
4 1956  Aad Bak            Feyenoord     18.06.19… ???    MV     
5 1956  Huub Bisschops     Roda JC Kerk… 22.01.19… ???    AV     
6 1956  Wim Bleijenberg    AFC Ajax      05.11.19… ???    AV     

Несколько изменений page_season_func():

  • seizoen2, что делает формат y1-y2 из y1 в качестве входных данных
  • без необходимости добавлять столбец year,теперь вы можете использовать map2_dfr .id аргумент

    page_season_func <- function(seizoen, page) {
      cat(".")
      seizoen2 <- paste(seizoen, seizoen+1, sep="-")
      df <- read_html(paste0("http://www.voetbal.com/spelerslijst/ned-eredivisie-", 
                             seizoen2, 
                             "/nach-name/", 
                             page)) %>%
        html_nodes("table") %>%
        html_table(fill=TRUE) %>%
        as.data.frame() %>%
        as.tbl() %>%
        select(Speler, Team, Geboren, Lengte, Positie)
    }
    
0 голосов
/ 27 мая 2018
seasons <- 
  1956:2017 %>% 
  paste(., . + 1, sep = "-")

res <- 
  cross2(seasons, 1:11) %>% 
  transpose() %>% 
  pmap_df(page_season_func)
...