我有一个相当大的数据库。我需要从“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"
)
}
}
有什么建议吗?
提前致谢
他的代码存在一些问题。首先,由于
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 格式给出开始和结束日期。您可以通过将年份变量粘贴到“-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"
))
}
}