首页 > 解决方案 > 创建一个循环以将遇到的数据下载并写入 csv

问题描述

我在使用 R 方面是个新手,但我正在尝试自学和学习。我正在尝试创建一个循环,以使用 worldmet 包将多个气象数据文件单独下载并保存为 csv 文件。

我有两个变量,遇到的站点代码和感兴趣的年份。我已经包含了创建相关年份列表的代码:

Startyear <- "2018"
Endyear <- "2020"

Yearlist <- seq(as.numeric(Startyear), as.numeric(Endyear))

我有一个 .csv 文件,其中列出了所有必需的站点代码,并将其读入 R。请参见下面的数据框的简化版本,但总共有 204 行。该数据框称为“siteinfo”。

code          station                ctry
037760-99999  GATWICK                UK
037690-99999  CHARLWOOD              UK
038760-99999  SHOREHAM               UK
038820-99999  HERSTMONCEUX WEST END  UK
037810-99999  BIGGIN HILL            UK

为一个站点导入一年价值的元数据的代码示例如下

importNOAA(code="037760-99999",year=2019,hourly=TRUE,precip=FALSE,PWC=FALSE,parallel=FALSE,quiet=FALSE)

我知道我可能需要一个嵌套循环来更改这两个变量,但我不确定我是否正确地处理了这个。我也知道我需要在代码值周围加上引号才能正确读取它,但是我想知道是否有一种快速的方法可以将其作为代码的一部分而不是编辑 csv 中的所有 204 值?

下载文件后我还需要一个单独的循环,还是可以将其包含在一段代码中?

我拥有的当前代码,我确信这有很多问题,所以我很感激任何指导,如下

for(i in 1:siteinfo$code) {
  for(j in 1:Yearlist){
  importNOAA(code=i,year=j,hourly = TRUE, precip= FALSE, PWC= FALSE, parallel = TRUE, quiet = FALSE)
  }}

这目前不起作用,所以如果你能帮我把它拼凑起来,如果可能的话,提供任何关于我哪里出错或如何改进我的编码的解释,我将非常感激!

标签: rloopscsvfor-loop

解决方案


您可以使用 和 中的某些函数完全避免循环(对于大型数据集和文件更好dplyrpurrr。当我尝试运行您的importNOAA代码时,出现无效参数错误,因此我使用了对该函数的更简单调用。

met_data <- siteinfo %>%
    full_join(data.frame(year = Yearlist), by = character(0)) %>%
    group_by(code, year) %>%
    mutate(dat = list(data.frame(code, year))) %>%
    mutate(met = purrr::map(dat, function(df) {
      importNOAA(code = df$code, year = df$year, hourly=TRUE, quiet=FALSE)
    }) ) %>% 
    select(-dat) 

此代码返回一个 tbl.df,其中最后一列是 data.frames 的列表,每个包含年份代码组合的数据。您可以使用met_data %>% summarize(met)将数据扩展为一个大 data.frame 以保存到 csv,或者如果您想将它们全部写入单个 csv,请使用 lapply:

lapply(1:nrow(met_data), function(x) {
             write.csv(met_data$met[x], 
                       file = paste(met_data$station[x], "_", met_data$year[x], ".csv", sep = ""))})

推荐阅读