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

Using Loop to extract climatic information from Library in R

提问人:Johanna Ramirez 提问时间:10/2/2023 更新时间:10/3/2023 访问量:26

问:

我有一个相当大的数据库。我需要从“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"
    )
  }
}

有什么建议吗?

提前致谢

R 循环 提取 序列 代码-气候

评论

1赞 MrFlick 10/2/2023
你能确切地说明你所说的“不起作用”是什么意思吗?你遇到错误了吗?你是否没有得到你所期望的输出——如果是这样,你所期望的输出到底是什么?你似乎在你的循环中覆盖了相同的变量,所以我不确定你希望所有值都去哪里。
0赞 Johanna Ramirez 10/2/2023
未创建@MrFlick ag_d数据框。输出应包含每个地理坐标和年份的每日温度信息。

答:

2赞 DaveArmstrong 10/3/2023 #1

他的代码存在一些问题。首先,由于 是 ,计算结果为 。相反,你想要.您对 .首先,该参数旨在成为长度为 2 的向量。在代码中执行此操作的方式将创建一个字符串,其中包含两个小数点,并用逗号分隔。当你把它变成一个数值时,它不会产生两个数值,它只产生一个值。相反,您可以只使用数据中已有的经度和纬度坐标。最后,该参数需要长度为 2 个字符的向量,以 YYYY-MM-DD 格式给出开始和结束日期。您可以通过将年份变量粘贴到“-01-01”作为开头,将“-12-31”粘贴到结尾。nrow(api_decimal$site)NULLseq_along(nrow(api_decimal$site))logical(0)seq_along(api_decimal$site)get_power()lonlatNAdates

如果循环已经运行,您也会在每次迭代时进行覆盖。您可以通过在循环外部初始化,然后在循环迭代中累积结果来解决此问题。此代码应有效:ag_dag_drbind(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"
    ))
  }
}