R:循环捕获来自多个站的天气数据

时间:2017-09-14 17:59:42

标签: r rwunderground

我想使用以下代码执行循环以从多个工作站捕获天气数据:

library(rwunderground)

sample_df <- data.frame(airportid = c("K6A2",
                                      "KAPA",
                                      "KASD",
                                      "KATL",
                                      "KBKF",
                                      "KBKF",
                                      "KCCO",
                                      "KDEN",
                                      "KFFC",
                                      "KFRG"),
                        stringsAsFactors = FALSE)

history_range(set_location(airport_code =sample_df$airportid), date_start = "20170815", date_end = "20170822",
              limit = 10, no_api = FALSE, use_metric = FALSE, key = get_api_key(),
              raw = FALSE, message = TRUE)

它不会起作用。

2 个答案:

答案 0 :(得分:1)

目前,您正在将整个向量(多个字符值)传递到history_range调用中。只需lapply迭代传递矢量值,甚至返回history_range()返回对象列表。下面使用定义的函数来传递参数。根据需要扩展功能以执行其他操作。

capture_weather_data <- function(airport_id) {
    data <- history_range(set_location(airport_code=airport_id), 
                  date_start = "20170815", date_end = "20170822",
                  limit = 10, no_api = FALSE, use_metric = FALSE, key = get_api_key(),
                  raw = FALSE, message = TRUE)

    write.csv(data, paste0("/path/to/output/", airport_id, ".csv"))
    return(data)
}

data_list <- lapply(sample_df$airportid, capture_weather_data)

另外,将列表中的每个项目命名为相应的 airport_id 字符值:

data_list <- setNames(data_list, sample_df$airportid)

data_list$K6A2   # 1st ITEM
data_list$KAPA   # 2nd ITEM
data_list$KASD   # 3rd ITEM
...

实际上,使用sapplylapply的包装器),您可以生成列表并在同一个调用中为每个项命名,但输入向量必须是字符类型(不是因子):

data_list <- sapply(as.character(sample_df$airportid), capture_weather_data, 
                    simplify=FALSE, USE.NAMES=TRUE)
names(data_list)

答案 1 :(得分:0)

我认为你根据我的理解从rwunderground包中提出的这个history_range函数需要一个天气地下API密钥。我去了该网站甚至注册了它,但是为了获得密钥(https://www.wunderground.com/weather/api),电子邮件验证过程目前似乎没有正常工作。

相反,我去了CRAN镜像(https://github.com/cran/rwunderground/blob/master/R/history.R),根据我的理解,该函数只接受一个字符串作为set_location参数。文档中提供的示例是

history(set_location(airport_code = "SEA"), "20130101") 

那么你应该做什么作为&#34;循环&#34;而是

sample_df <- as.vector(sample_df)
for(i in 1:length(sample_df)){
  history_range(
    set_location(airport_code = sample_df[[i]]), 
    date_start = "20170815", date_end = "20170822",
    limit = 10, no_api = FALSE, use_metric = FALSE, 
    key = get_api_key(),
    raw = FALSE, message = TRUE)
}

如果这不起作用,请告诉我。 (Ack,有人在我输入这个问题时也给了这个问题另一个答案。)