我有一些看起来像这样的数据:
ID lat long university date cat2 cat3 cat4 ...
00001 32.001 -64.001 MIT 2011-07-01 xyz foo NA ...
00002 45.783 67.672 Harvard 2011-07-01 abc NA lion ...
00003 54.823 78.762 Stanford 2011-07-01 xyz bar NA ...
00004 76.782 23.989 IIT Bombay 2011-07-02 NA foo NA ...
00005 32.010 -64.010 NA 2011-07-02 NA NA hamster...
00006 32.020 -64.020 NA 2011-07-03 NA NA NA ...
00006 45.793 67.700 NA 2011-08-01 NA bar badger ...
我想基于lat-long坐标来计算大学专栏的缺失值。这显然弥补了,因为数据的500K行在大学专栏上相当稀疏。像Amelia这样的估算包似乎想要根据线性模型拟合数值数据,动物园似乎想要根据某种有序系列填充缺失值,而我没有。我想匹配 close lat-longs,而不仅仅是精确的lat-long对,所以我不能只通过匹配另一列的值来填充一列。
我打算通过查找与大学相关联的所有纬度 - 长对,在它们周围绘制一个边界框,然后对于所有具有长对子但缺少大学数据的行来解决问题,为大学依据添加适当的值他们所在的长方箱,或者可能位于已知地点中点的某个半径范围内。
有没有人做过类似的事情?是否有任何软件包可以更容易地在地理位置上接近纬度对,或者甚至可以进行基于地理位置的估算?
如果可行的话,我想根据数据中的现有价值来克服一些其他缺失值(如xyz的90%行,foo,哈佛值也在第4类中有狮子) ,所以我们可以为cat4)计算一些缺失的值,但这是另一个问题,我会想象一个更难的,我甚至可能没有足够的数据来成功。
答案 0 :(得分:2)
我没有考虑解决你所描述的内容的方法。我做了一些类似的类型分析,最后我写了一些定制的东西。
只是为了给你一个跳跃点,这是一个做最近邻居计算方法的例子。计算邻居有点慢,因为显然,你必须针对每个其他点计算每个点。
## make some pretend data
n <- 1e4
lat <- rnorm(n)
lon <- rnorm(n)
index <- 1:n
myDf <- data.frame(lat, lon, index)
## create a few helper functions
cartDist <- function(x1, y1, x2, y2){
( (x2 - x1)^2 - (y2 - y1)^2 )^.5
}
nearestNeighbors <- function(x1, y1, x2, y2, n=1){
dists <- cartDist(x1, y1, x2, y2)
orders <- order(dists)
index <- which(orders <= n)
neighborValues <- dists[index]
return(list(index, neighborValues))
}
## this could be done in an apply statement
## but it's fugly enough as a loop
system.time({
for (i in 1:nrow(myDf)){
myDf[i,]$nearestNeighbor <- myDf[nearestNeighbors( myDf[i,]$lon, myDf[i,]$lat, myDf[-i,]$lon, myDf[-i,]$lat )[[1]],]$index
}
})