这个错误提示是因为在循环中,每个站点都会尝试将6个土壤指标复制到表1中的相应站点名所在的行,但是表1中每个站点只有1行,因此会出现上述错误。

为了解决这个问题,可以将复制6个土壤指标的代码放在一个内部循环中,这样每次循环只复制一个土壤指标,避免了出现上述错误。具体实现如下:

读取表1:站点名和经纬度

table1 <- read.csv("E:/weidan/表1.csv", stringsAsFactors = FALSE)

读取表2:经纬度和土壤信息指标

table2 <- read.csv("E:/weidan/表2.csv", stringsAsFactors = FALSE)

计算两个经纬度之间的球面距离(单位:千米)

haversine_distance <- function(lat1, lon1, lat2, lon2) { r <- 6371 # 地球半径,单位:千米 dlat <- (lat2 - lat1) * pi / 180 dlon <- (lon2 - lon1) * pi / 180 a <- sin(dlat / 2) ^ 2 + cos(lat1 * pi / 180) * cos(lat2 * pi / 180) * sin(dlon / 2) ^ 2 c <- 2 * atan2(sqrt(a), sqrt(1 - a)) return(r * c) }

设置经纬度保留的小数位数

decimal_places <- 3

遍历表1中的每个站点

for (i in 1:nrow(table1)) { min_distance <- NULL nearest_latitude <- NULL nearest_longitude <- NULL

遍历表2中的每个经纬度

for (j in 1:nrow(table2)) { distance <- haversine_distance(round(table1[i, "lat1"], decimal_places), round(table1[i, "lon1"], decimal_places), round(table2[j, "lat2"], decimal_places), round(table2[j, "lon2"], decimal_places))

# 如果是第一个经纬度,或者距离更小,则更新最小距离和最近的经纬度
if (is.null(min_distance) || distance < min_distance || is.na(min_distance)) {
  min_distance <- distance
  nearest_latitude <- table2[j, "lat2"]
  nearest_longitude <- table2[j, "lon2"]
}

}

遍历6层土壤指标,将最近的经纬度对应的土壤信息指标复制到表1中的相应站点名所在的行

for (k in 1:6) { table1[i, paste0("S", k, "LL")] <- table2[table2$lat2 == nearest_latitude & table2$lon2 == nearest_longitude, paste0("S", k, "LL")] table1[i, paste0("S", k, "DU")] <- table2[table2$lat2 == nearest_latitude & table2$lon2 == nearest_longitude, paste0("S", k, "DU")] table1[i, paste0("S", k, "SAT")] <- table2[table2$lat2 == nearest_latitude & table2$lon2 == nearest_longitude, paste0("S", k, "SAT")] table1[i, paste0("S", k, "BDM")] <- table2[table2$lat2 == nearest_latitude & table2$lon2 == nearest_longitude, paste0("S", k, "BDM")] } }

将匹配好的结果保存到CSV文件

write.csv(table1, file = "E:/weidan/JIEGUO.csv", row.names = FALSE


原文地址: https://www.cveoy.top/t/topic/drOh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录