用Loop从R中的Library中提取气候信息

6kkfgxo0  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(87)

我有一个很大的数据库。我需要从“Nasapower”图书馆提取气候信息。
我的简化数据集看起来像这样:

api_decimal<- data.frame (
    AP_COD = c("LOM_A", "LOM_L", "LOM_M", "LOM_LA", "LOM_CO"),
    LAT_DEC = c(25.628,
                25.641,
                25.415,
                25.435,
                25.424),
    LONG_DEC = c(7.300,
                 7.314,
                 7.450,
                 7.449,
                 7.443)
    
  )

api_decimal$site <- paste(api_decimal$LAT_DEC, ",", api_decimal$LONG_DEC)

我尝试创建一个循环来提取2014年至2020年所有站点(纬度,经度)的“每日”“温度(TM2)”信息,但循环不起作用:

years <- c("2014", "2015", "2016", "2017", "2018", "2019")
for (i in seq_along(years)){
  year <- years[[i]]
  
  for(j in seq_along(nrow(api_decimal$site))) {
    sites <- as.numeric(api_decimal$site[j, ])
    ag_d <- get_power(
      community = "ag",
      lonlat = sites,
      pars = "T2M",
      dates = years,
      temporal_api = "daily"
    )
  }
}

有什么建议吗?
预先感谢

2ul0zpep

2ul0zpep1#

他的代码出了点问题。首先,由于nrow(api_decimal$site)NULL,因此seq_along(nrow(api_decimal$site))的计算结果为logical(0)。你需要seq_along(api_decimal$site)。您对get_power()的调用有几个问题。首先,lonlat参数是一个长度为2的向量。你在代码中做的方式创建了一个字符串,其中两个小数点由逗号分隔。当你把它转换成一个数值时,它不会产生两个数值,它只会产生一个NA值。相反,您可以只使用数据中已经存在的经度和纬度坐标。最后,dates参数需要长度为2的字符向量,以YYYY-MM-DD格式给出开始和结束日期。您可以通过将year变量粘贴到“-01-01”作为开始,粘贴到“-12-31”作为结束来实现这一点。
如果循环已经运行,那么在每次迭代中,您也将是ag_d。您可以通过在循环外初始化ag_d来解决这个问题,然后在循环的迭代中使用rbind(ag_d, new_result)来累积结果。这段代码应该工作:

library(nasapower)
api_decimal<- data.frame (
  AP_COD = c("LOM_A", "LOM_L", "LOM_M", "LOM_LA", "LOM_CO"),
  LAT_DEC = c(25.628,
              25.641,
              25.415,
              25.435,
              25.424),
  LONG_DEC = c(7.300,
               7.314,
               7.450,
               7.449,
               7.443)
  
)

years <- c("2014", "2015", "2016", "2017", "2018", "2019")
ag_d <- NULL
for (i in seq_along(years)){
  year <- years[[i]]
  for(j in seq_along(api_decimal$LONG_DEC)) {
    ag_d <- rbind(ag_d, 
                  get_power(
                    community = "ag",
                    lonlat = c(api_decimal$LONG_DEC[j], api_decimal$LAT_DEC[j]),
                    pars = "T2M",
                    dates = c(paste0(years[i], "-01-01"), 
                              paste0(years[i], "-12-31")),
                    temporal_api = "daily"
    ))
  }
}

相关问题