以下是我试图在更大的数据库中解决和实现的问题示例:
我在新世界中有一个稀疏的网格点,其中lat和long定义如下。
LAT<-rep(-5:5*10, 5)
LON<-rep(seq(-140, -60, by=20), each=11)
我知道网格上某些点的颜色
COLOR<-(c(NA,NA,NA,"black",NA,NA,NA,NA,NA,"red",NA,NA,"green",NA,"blue","blue",NA,"blue",NA,NA,"yellow",NA,NA,"yellow",NA+
NA,NA,NA,"blue",NA,NA,NA,NA,NA,NA,NA,"black",NA,"blue","blue",NA,"blue",NA,NA,"yellow",NA,NA,NA,NA,"red",NA,NA,"green",NA,"blue","blue"))
data<-as.data.frame(cbind(LAT,LON,COLOR))
我想要做的是将COLOR中的NA值替换为与该点关闭(距离)的颜色。在实际实现中,我对关系并不太担心,但我认为这是可能的(我可以手动修复)。
由于
答案 0 :(得分:6)
烨。
首先,使用data.frame
制作数据框,或将所有内容强制转换为字符:
data<-data.frame(LAT=LAT,LON=LON,COLOR=COLOR)
将数据框拆分 - 您可以一次性完成此操作,但这会让事情变得更加明显:
query = data[is.na(data$COLOR),]
colours = data[!is.na(data$COLOR),]
library(FNN)
neighs = get.knnx(colours[,c("LAT","LON")],query[,c("LAT","LON")],k=1)
现在将替换颜色直接插入data
数据帧:
data[is.na(data$COLOR),"COLOR"]=colours$COLOR[neighs$nn.index]
plot(data$LON,data$LAT,col=data$COLOR,pch=19)
但请注意,距离是使用lat-long上的毕达哥拉斯几何计算的,这是不正确的,因为地球不是平坦的。您可能必须先将坐标转换为其他坐标。
答案 1 :(得分:1)
我提出了这个解决方案,但是Spacedman看起来好多了。请注意,我还假设地球在这里是平坦的:)
# First coerce to numeric from factor:
data$LAT <- as.numeric(as.character(data$LAT))
data$LON <- as.numeric(as.character(data$LON))
n <- nrow(data)
# Compute Euclidean distances:
Dist <- outer(1:n,1:n,function(i,j)sqrt((data$LAT[i]-data$LAT[j])^2 + (data$LON[i]-data$LON[j])^2))
# Dummy second data:
data2 <- data
# Loop over data to fill:
for (i in 1:n)
{
if (is.na(data$COLOR[i]))
{
data$COLOR[i] <- data2$COLOR[order(Dist[i,])[!is.na(data2$COLOR[order(Dist[i,])])][1]]
}
}