R: 用最接近的点的值替换NA

7

以下是我正在尝试解决并在更大的数据库中实施的问题示例:

我有一个点状网格分布在新世界各地,其中纬度和经度定义如下。

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值。在实际实现中,我不太担心出现并列的情况,但我认为这是可能的(我可以手动解决这些问题)。

谢谢


我认为如果你将数据框分成有颜色和没有颜色的部分,你可以将其输入FNN::get.knnx(colours,blanks)中并使用快速最近邻代码... 嗯... - Spacedman
2个回答

8

好的。

首先,使用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)

请注意,然而距离是通过使用经纬度的勾股几何计算出来的,这并不准确,因为地球并不是平坦的。您可能需要先将您的坐标转换成其他形式。


这太棒了。谢谢你。我会试一下的。我想到了最后一个问题,但对于实际数据集来说并不是一个大问题 - 距离非常接近(我正在寻找距离某个国家海岸线附近点最近的国家)。 - user1612278

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]]
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接