R:用最近点的值替换NA

时间:2012-08-20 16:35:23

标签: r

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

我在新世界中有一个稀疏的网格点,其中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值替换为与该点关闭(距离)的颜色。在实际实现中,我对关系并不太担心,但我认为这是可能的(我可以手动修复)。

由于

2 个答案:

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