【问题标题】:Creating a df of dates to pass onto a purrr function创建日期的 df 以传递给 purrr 函数
【发布时间】:2020-02-07 20:44:35
【问题描述】:

我正在尝试创建一个具有 2 列 start_dateend_datetbl_df。每行在start_dateend_date 之间将有6 天。我想使用每行中的start_dateend_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")

reprex package (v0.3.0) 于 2020 年 2 月 7 日创建

示例函数为:

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_dateend_date 值通过safely 传递给purrr::map2dfr

【问题讨论】:

  • 在您的 scrape_function 中,您正在传递“url”并返回“df”(不清楚)
  • scrape 函数有一个 URL,它带有一个开始日期和结束日期。对 scrape 函数的每次调用都使用 URL 并最终解析为 df。我没有在示例中包含 httr 和 json 步骤。我想对使用 start_date 和 end_date 的组合构建的多个 URL 进行行绑定,这些 URL 输入到 scrape 函数中。
  • 请通过map2查看我更新的解决方案。我无法测试抓取部分,因为 url 是虚拟的
  • 假设抓取功能正常工作,如果任何抓取结果不返回 df,我将如何安全地包装它?
  • 我会将scrape_function 包装成possiblyf1 &lt;- possibly(scrape_function, otherwise = NA),然后调用f1

标签: r purrr lubridate


【解决方案1】:

我认为网络抓取代码只是混淆了这个问题。只是您想将一个时间段分成 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))

【讨论】:

  • 你一针见血。我只是想创建一个包含两个日期的序列,以便传递给一个抓取函数参数。鉴于网站的限制,我想将数据限制为 1 周,但要传递一系列刮擦直到结束日期。您的代码似乎很完美。唯一的问题是 end_date 的最后一个值超过了 8/1。我遇到的第二个问题是如何将这个 df 传递给 purrr 函数,或者我最好只创建 2 个日期序列向量并以这种方式传递给 purrr::map2_dfr?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2015-10-06
相关资源
最近更新 更多