我有两个矩阵,如下所示:
OBS = matrix(data=c(0.5, 1.0, 1.5, 2.0, 2.5, 3.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
3, 4, 2, 4, 3, 5),
nrow=6, ncol=3)
colnames(OBS)=c("Lat", "Lon", "Tas")
OBS = data.frame(OBS)
MOD = matrix(data=c(1.5, 3.0, 0.0, 0.0, 3, 4), nrow=2, ncol=3)
colnames(MOD)=c("Lat", "Lon", "Tas")
MOD = data.frame(MOD)
我想使用OBS中的坐标并从MOD中搜索最接近的坐标集并返回相应的Tas值。因此,输出应为:
OUT = data.frame(c(3, 3, 3, 3, 4, 4))
我应用了以下解决方案:
library(geosphere)
# create distance matrix
mat <- distm(OBS[,c('Lon','Lat')], MOD[,c('Lon','Lat')],
fun = distVincentyEllipsoid)
# Find shortest distance in matrix and assign tas values from MOD
OUT <- MOD$Tas[max.col(-mat)]
此示例在此示例中工作正常,但如果尝试使用具有几百行或更多行的数据集,则它将不再起作用。有人知道为什么吗?
答案 0 :(得分:1)
也许您可以尝试以下代码来查看它是否可以与更大的数据集一起使用
OUT <- data.frame(x = MOD$Tas[apply(abs(outer(OBS$Lat+1i*OBS$Lon,MOD$Lat+1i*MOD$Lon,"-")),1,which.min)])
如此
> OUT
x
1 3
2 3
3 3
4 3
5 4
6 4