【问题标题】:Calling an API within a mutate statement in R在 R 中的 mutate 语句中调用 API
【发布时间】:2020-11-03 01:04:09
【问题描述】:

我正在尝试使用API 确定给定日期的日出时间

所以我有一个这样的数据框

        Date
1 2018-01-03
2 2018-01-03
3 2018-01-04
4 2018-01-08
5 2018-01-09

虽然我可以在没有粘贴语句的情况下使其工作,但当我将其放入 mutate 时,它​​不起作用并返回错误:

dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
"2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")


dates %>% 
  mutate(sunrise = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[1])
           )

ERROR:
Error: Problem with `mutate()` input `sunrise`.
x length(url) == 1 is not TRUE
i Input `sunrise` is `as.character(...)`.

这里的目标是我希望每天都有一个新的日出列。如果我更改 paste0 字段并给它一个确切的字符串,但不是在 mutate 中,它可以完美地工作,我不知道为什么......

【问题讨论】:

    标签: r api tidyverse dplyr


    【解决方案1】:

    这可以通过dplyr::rowwise实现

    library(dplyr)
    library(httr)
    library(jsonlite)
    
    dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
                                     "2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")
    
    dates %>% 
      rowwise() %>% 
      mutate(sunrise = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=",Date))$content))$results[1]))
    #> # A tibble: 5 x 2
    #> # Rowwise: 
    #>   Date       sunrise    
    #>   <chr>      <chr>      
    #> 1 2018-01-03 12:19:53 PM
    #> 2 2018-01-03 12:19:53 PM
    #> 3 2018-01-04 12:19:52 PM
    #> 4 2018-01-08 12:19:27 PM
    #> 5 2018-01-09 12:19:15 PM
    

    【讨论】:

    • 太棒了;你能告诉我更多关于为什么原来的不起作用吗?
    • 问题是对 API 的调用不是矢量化操作,即您必须循环访问日期。这就是 rowwise 或 purrr::map 或 lapply 正在做的事情。
    【解决方案2】:

    另一个选项是map 来自purrr

    library(dplyr)
    library(purrr)
    library(jsonlite)
    dates %>%
         mutate(sunrise = map_chr(sprintf("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=%s", Date), 
             ~ as.character(fromJSON(rawToChar(GET(.x)$content))$results[1])))
    #        Date     sunrise
    #1 2018-01-03 12:19:53 PM
    #2 2018-01-03 12:19:53 PM
    #3 2018-01-04 12:19:52 PM
    #4 2018-01-08 12:19:27 PM
    #5 2018-01-09 12:19:15 PM
    

    数据

    dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
    "2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多