6

这是我试图在更大的数据库中解决和实现的问题的示例:

我在新世界中有一个稀疏的点网格,纬度和经度定义如下。

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 值替换为与该点最接近(在距离上)的颜色。在实际实现中,我并不太担心关系,但我认为这是可能的(我可能会手动修复它们)。

谢谢

4

2 回答 2

7

是的。

首先,让你的数据框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)

但是请注意,距离是使用经纬度上的毕达哥拉斯几何计算的,这是不正确的,因为地球并不平坦。您可能必须先将坐标转换为其他坐标。

于 2012-08-20T17:02:09.220 回答
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]]
  }
}
于 2012-08-20T17:22:43.850 回答