一个表中有站点名和经纬度第二个表中有站点的经纬度和各个土壤信息指标我们想让第一个表中的每个站点匹配到相应的土壤信息但是经纬度不是一一对应的需要用临近值写了一段代码# 读取表1:站点名和经纬度table1 - readcsvEweidan表1csv stringsAsFactors = FALSE# 读取表2:经纬度和土壤信息指标table2 - readcsvEweidan表2csv string
这个错误提示是因为在循环中,每个站点都会尝试将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 著作权归作者所有。请勿转载和采集!