2

次のようなデータがあります。

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 ...

緯度と経度の座標に基づいて、大学の列に欠損値を代入したいと考えています。これは、データが 500K 行あり、大学の列ではかなりまばらであるため、明らかに構成されています。アメリアのような代入パッケージは、線形モデルに従って数値データを適合させたいようであり、動物園は、私が持っていないある種の順序付けられたシリーズに基づいて欠損値を埋めたいようです。正確な緯度と経度のペアだけでなく、近い緯度と経度を一致させたいので、別の列の値を一致させることで 1 つの列を埋めることはできません。

大学に関連付けられているすべての緯度と経度のペアを見つけて、それらの周りに境界ボックスを描画し、緯度と経度のペアを含むが大学のデータが欠落しているすべての行に対して、緯度に応じて大学の適切な値を追加することで、問題にアプローチする予定です。 - それらが入っている長い箱、またはおそらく既知の場所の中点から特定の半径内にあります。

誰かが似たようなことをしたことがありますか?地理的に近い緯度と経度のペアをグループ化したり、地理に基づいた代入を実行したりするのを容易にするパッケージはありますか?

それが機能する場合は、データ内の既存の値に基づいて他の欠損値のいくつかを代入することにクラックを入れたいと思います (xyz、foo、ハーバード値を含む行の 90% も 4 番目のカテゴリにライオンがあるため、 cat4 のいくつかの欠損値を代入することができます) が、それは別の問題であり、私はもっと難しい問題を想像します。

4

1 に答える 1

2

あなたが説明していることを解決するためのパッケージは考えていません。私はいくつかの同様の型分析を行っており、最終的には特注のものを書きました。

出発点を示すために、最近傍計算を行う 1 つの方法の例を次に示します。明らかに、他のすべてのポイントに対してすべてのポイントを計算する必要があるため、近隣の計算は少し遅くなります。

## 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
}
})
于 2011-11-11T19:42:49.383 に答える