【问题标题】:R: replacing NA with value of closest pointR:用最近点的值替换 NA
【发布时间】:2012-08-20 16:35:22
【问题描述】:

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

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

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) 并使用快速最近邻代码......嗯...

标签: r


【解决方案1】:

是的。

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

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

【讨论】:

  • 这很棒。谢谢你。我会试试看。我想到了最后一个问题,但对于实际数据集来说这不是一个大问题 - 距离很近(我正在寻找离该国家海岸最近的国家)
【解决方案2】:

我想出了这个解决方案,但 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-04-22
    • 1970-01-01
    • 2014-06-13
    • 2011-12-05
    相关资源
    最近更新 更多