R:用最近点的值替换NA

R:用最近点的值替换NA,r,R,下面是我试图解决的一个问题的示例,并在一个更大的数据库中实现: 我在新世界有一个稀疏的点网格,lat和long定义如下 LAT<-rep(-5:5*10, 5) LON<-rep(seq(-140, -60, by=20), each=11) LAT是的 首先,使用data.frame创建数据框,否则所有内容都会被强制为字符: data<-data.frame(LAT=LAT,LON=LON,COLOR=COLOR) 现在将替换颜色直接插入数据数据框: data[is.na

下面是我试图解决的一个问题的示例,并在一个更大的数据库中实现:

我在新世界有一个稀疏的点网格,lat和long定义如下

LAT<-rep(-5:5*10, 5)
LON<-rep(seq(-140, -60, by=20), each=11)
LAT是的

首先,使用
data.frame
创建数据框,否则所有内容都会被强制为字符:

data<-data.frame(LAT=LAT,LON=LON,COLOR=COLOR)
现在将替换颜色直接插入
数据
数据框:

data[is.na(data$COLOR),"COLOR"]=colours$COLOR[neighs$nn.index]
plot(data$LON,data$LAT,col=data$COLOR,pch=19)

但是请注意,距离是使用毕达哥拉斯几何体在lat long上计算的,这是不正确的,因为地球不是平的。您可能需要先将坐标转换为其他坐标。

我提出了这个解决方案,但Spacedman的似乎要好得多。注意,我还假设地球是平的:)

#首先强制从系数转换为数字:

data$LAT我想如果你把数据框分成有颜色的和没有颜色的,你可以把它输入到FNN::get.knx(颜色,空格)中,并使用快速近邻代码。。。嗯……这太好了。非常感谢。我会试试看。我想到了最后一个问题,但对于实际数据集来说这不是一个大问题——距离非常近(我正在寻找距离该国海岸线最近的国家)
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[is.na(data$COLOR),"COLOR"]=colours$COLOR[neighs$nn.index]
plot(data$LON,data$LAT,col=data$COLOR,pch=19)
# 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]]
  }
}