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

R 创建循环以下载met数据并将其写入csv,r,loops,csv,for-loop,R,Loops,Csv,For Loop,我是一个使用R的新手,但我一直在努力自学。我正在尝试创建一个循环,使用worldmet软件包将多个met数据文件单独下载并保存为csv文件 我有两个变量,met网站代码和感兴趣的年份。我已经包含了创建相关年份列表的代码: Startyear <- "2018" Endyear <- "2020" Yearlist <- seq(as.numeric(Startyear), as.numeric(Endyear)) 为一个站点导入一年的

我是一个使用R的新手,但我一直在努力自学。我正在尝试创建一个循环,使用worldmet软件包将多个met数据文件单独下载并保存为csv文件

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

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

Yearlist <- seq(as.numeric(Startyear), as.numeric(Endyear))
为一个站点导入一年的metdata的代码示例如下

importNOAA(code="037760-99999",year=2019,hourly=TRUE,precip=FALSE,PWC=FALSE,parallel=FALSE,quiet=FALSE)
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)
  }}
我知道我可能需要一个嵌套循环来更改这两个变量,但我不确定我是否正确地执行了这一操作。我也知道我需要在代码值周围加上引号,以便正确阅读,但是我想知道是否有一种快速的方法将其作为代码的一部分,而不是编辑csv中的所有204个值

在下载文件之后,我是否还需要一个单独的循环,或者这可以包含在一段代码中

我目前的代码,我相信这有很多错误,所以我很感激任何指导,如下所示

importNOAA(code="037760-99999",year=2019,hourly=TRUE,precip=FALSE,PWC=FALSE,parallel=FALSE,quiet=FALSE)
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)
  }}

这目前不起作用,所以如果你能帮我把它拼凑起来,如果可能的话,请解释一下我哪里出了问题,或者我如何改进我的编码,我将不胜感激

不能使用for循环,比如for(1:siteinfo$code中的i){}

举个简单的例子


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

也许这是可行的

您可以使用
dplyr
purrr
中的一些函数完全避免循环(对于大型数据集和文件更好)。当我试图运行你的
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) 

我刚刚尝试了这个,但是它出现了错误:“1:nrow(siteinfo$code):长度为0的参数中的错误”你知道如何解决这个问题吗?oww抱歉,请使用nrow(siteinfo)如果Yearlist只是一个变量,请使用length()函数而不是nrow()抱歉,我的importNOAA代码中有一个打字错误-这个问题现在已经解决了!但是,当尝试运行您提供的代码时,我收到错误“error:
by
必须指定要联接的变量”。你能解释一下每一行要做什么吗?@alssm-这种
full_join
行为来自
dplyr
v1.0.1。