You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:54:01