R语言双循环不匹配问题:爬取TerraClimate气温数据行数异常
问题原因
你当前数据量翻倍的核心原因是使用了嵌套的双循环:外层遍历2个坐标点,内层又遍历2个点位名,导致每一个坐标都会被匹配两次点位名,合计执行4次数据拉取,自然得到了2倍的预期数据量。
修复思路
只保留单层循环,用索引同时匹配坐标列表和点位名列表即可,不需要嵌套循环。同时建议不要用c作为自定义变量名,c是R内置的拼接函数,重名可能会引发不可预期的错误。
修复后完整代码
# 定义坐标和点位名 loc1 <- c(-70.6666667, -33.4500000) loc2 <- c(-71.6163889,-33.0458333) loc_list <- list(loc1, loc2) loc_names <- c("Loc 1", "Loc 2") # 拉取气温数据 var <- "tmax" terra <- paste0("http://thredds.northwestknowledge.net:8080/thredds/dodsC/agg_terraclimate_", var, "_1958_CurrentYear_GLOBE.nc") nc <- nc_open(terra) lon <- ncvar_get(nc, "lon") lat <- ncvar_get(nc, "lat") DAT <- NULL # 按索引单层遍历,同时对应坐标和点位名 for (i in seq_along(loc_list)) { current_loc <- loc_list[[i]] current_name <- loc_names[i] flon = match(abs(lon - current_loc[1]) < 1/48, 1) lonindex = which(flon %in% 1) flat = match(abs(lat - current_loc[2]) < 1/48, 1) latindex = which(flat %in% 1) start <- c(lonindex, latindex, 1) count <- c(1, 1, -1) data <- as.numeric(ncvar_get(nc, varid = var, start = start, count)) data <- as.data.table(data) data$date <- seq(as.Date("1958-02-01"), length.out=756, by="month") data$ym_chr <- format(data$date, format = "%Y-%m") data[,date:=NULL] data$LOCATION <- current_name DAT <- rbind(DAT, data) } # 关闭nc连接,释放资源 nc_close(nc)
修改后循环只会执行2次,每次对应1个坐标和1个点位名,最终返回的总数据量为1512条,符合预期。
内容的提问来源于stack exchange,提问作者Magdalena Cortina
相关产品推荐
相关产品推荐

