创建一个循环以下载met数据并将其写入csv

0ejtzxu1  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(158)

我是一个使用R的新手,但我正在尝试自学和学习,我正在尝试创建一个循环来下载多个met数据文件,并使用worldmet包将其单独保存为csv文件。
我有两个变量,met站点代码和感兴趣的年份。我已经包含了创建所关注年份列表的代码:

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

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

我有一个.csv文件,其中列出了所有需要的站点代码,并已将其读入R。请参见下面的简化版本的 Dataframe ,但总共有204行。此 Dataframe 称为“站点信息”。

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)
  }}

这是目前不工作,所以如果你能帮助我拼凑起来,如果可能的话,提供任何解释,我哪里出了问题,或者我如何可以改善我的编码,我将不胜感激!

83qze16e

83qze16e1#

使用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. frame列表,每个data. frame包含一个year-code组合的数据。您可以使用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 = ""))})
hec6srdp

hec6srdp2#

你不能像for(i in 1:siteinfo$code){}那样使用for循环...
只是一个简短示例

for(i in 1:mtcars$mpg){
  print(i)
}

输出:

numerical expression has 32 elements: only the first used[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21

因此,只需使用如下索引

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

也许这是可行的

相关问题