Создание df дат для передачи в функцию purrr - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь создать tbl_df, который имеет 2 столбца start_date и end_date. Каждая строка будет иметь 6 дней между start_date и end_date. Я хочу использовать значения start_date и end_date из каждой строки для подачи в функцию очистки, используя purrr::map.

# example tbl_df
df <- tibble::tribble(
  ~start_date,   ~end_date,
   "6/1/2019",  "6/7/2019",
   "6/8/2019", "6/14/2019"
  )

df
#> # A tibble: 2 x 2
#>   start_date end_date 
#>   <chr>      <chr>    
#> 1 6/1/2019   6/7/2019 
#> 2 6/8/2019   6/14/2019

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

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date


start_date <- lubridate::ymd("2019-06-01")
end_date <- lubridate::ymd("2019-08-01")

start_dates <- seq(start_date, end_date, by = "1 week" )
end_dates <- seq (lubridate::ymd("2019-06-07"), end_date, by = "1 week")

Создано в 2020-02-07 с помощью пакета prepx (v0.3.0)

Примером функции может быть:

scrape_function <- function(start_date, end_date) {

url <- glue::glue("http://www.example.com/start_date={start_date}&end_date={end_date}")

# scrape data and return df

df
}

Кроме того, как бы я использовал значения start_date и end_date для передачи purrr::map2dfr с использованием safely?

1 Ответ

0 голосов
/ 13 февраля 2020

Я думаю, что веб-код очистки просто запутал проблему. Это просто, что вы хотите разделить период времени на 7 дней? Возможно это

start_date <- lubridate::ymd("2019-06-01")
end_date <- lubridate::ymd("2019-08-01")

split_weeks <- function(start_date, end_date){
    df <- tibble::tribble(
        ~start_date,   ~end_date,
        start_date,  start_date + 6)
    interim_end_date <- start_date + 6
    while(interim_end_date < end_date){
        df <- df %>% tibble::add_row(start_date=interim_end_date + 1, 
                                     end_date=interim_end_date + 7)
        interim_end_date <- interim_end_date + 7
    }
    return(df)
}

split_weeks(start_date, end_date)
#> # A tibble: 9 x 2
#>   start_date end_date  
#>   <date>     <date>    
#> 1 2019-06-01 2019-06-07
#> 2 2019-06-08 2019-06-14
#> 3 2019-06-15 2019-06-21
#> 4 2019-06-22 2019-06-28
#> 5 2019-06-29 2019-07-05
#> 6 2019-07-06 2019-07-12
#> 7 2019-07-13 2019-07-19
#> 8 2019-07-20 2019-07-26
#> 9 2019-07-27 2019-08-02

Или исправить ваш код, чтобы дать векторы равной длины

start_dates <- seq(start_date, end_date, by = "1 week" )
end_dates <- seq(lubridate::ymd("2019-06-07"), by = "1 week",
    length.out=length(start_dates))
...