2016-05-05 4 views
1

GPS座標を含む2つのデータセットをマージしようとしています。私はこれを達成するために関数を使用しようとしています。問題は、両方のデータセットからのGPS座標が正確に一致しないことです。したがって、gps座標の最も近いペアを見つけることによって、あるデータセットの変数と他のデータセットの変数を一致させることです。2つのデータセットを最も近いgps座標で結合する関数を作成しようとしています

私はファジー結合パッケージで成功しましたが、部分一致(〜75%)しかできませんでした。以下の関数を使用して、私はより高い一致度を得ることを望んでいました。 1つのデータセットは他のデータセットより短く、ここでは2つのforループを使用し、各forループは各データセットを通過するという考え方です。

2つのポイント間の距離がアンカーよりも小さい場合、新しい(より短い)距離が新しいアンカーになるように、「アンカー」(両方のデータセットの最初の観察間の距離)が確立されます。 for-loopは最短距離が見つかるまで続き、ここでpairedDataという新しいデータセットの末尾に両方のデータセットの変数が追加されます。両方のデータセットから取得したデータで最短のデータセット(6314行)が使用されている限り、データセットを残しておく必要があります。

私は関数がうまくいくはずだと思うが、rbind()は非常に遅く、rbindlist()の実装に問題がある。どのように私はこれを達成するかもしれないかに関する任意のアイデア?

combineGPS <- function(harvest,planting) { 
require(sp) 
require(data.table) 
longH <- harvest$long 
latH <- harvest$lat 
longP <- planting$long 
latP <- planting$lat 
rowsH <- nrow(harvest) 
rowsP <- nrow(planting) 
harvestCoords <- cbind(longH,latH) 
harvestPoints <- SpatialPoints(harvestCoords) 
plantingCoords <- cbind(longP,latP) 
plantingPoints <- SpatialPoints(plantingCoords) 

#plantingデータがアタッチ、植栽データの各行(6314)を取ると、最も近い収穫データポイント(16626)を見つけるために

#need収穫データより短い

anchor <- spDistsN1(plantingPoints[1,],harvestPoints[1,],longlat=FALSE) 
pairedData <- data.frame(long=numeric(), 
       lat=numeric(), 
       variety=factor(), 
       seedling_rate=numeric(), 
       seed_spacing=numeric(), 
       speed=numeric(), 
       yield=numeric(), 
       stringsAsFactors=FALSE) 

for (p in 1:rowsP){ 
    for (h in 1:rowsH){ 

    if(spDistsN1(plantingPoints[p,],harvestPoints[h,],longlat=FALSE) <= anchor){ 
    anchor <- spDistsN1(plantingPoints[p,],harvestPoints[h,],longlat=FALSE) 
    pairedData[p,]<-c(planting[p,]$long, planting[p,]$lat, planting[p,]$variety, planting[p,]$seedling_rate, planting[p,]$seed_spacing, planting[p,]$speed, harvest[h,]$yield) 
    }  

     } 
    } 
    return(pairedData) 
} 
doesItWork=combineGPS(harvest,planting) 
doesItWork 

答えて

0

あなたの質問が正しく理解されている場合、収穫データの上にforループが必要な理由がわかりません。関数spDistsN1は指定された点までの距離の行列を返します。私はあなたの収穫データをptsとして、植え付けデータをptとしてこの関数に入力してから、それぞれの距離が最も短いインデックスをそれぞれptにしてください。植付データのみをループします。多くの時間を節約できます。また、データがSpatialPointsであり、これらのオブジェクトに指定しないことを指定しているため、をspDistsN1に指定しないでください。

例ループ:

for (p in 1:rowsP){ 
    #Get the distance from the pth planting point to all of the havest points 
    Dists <- spDistsN1(pts = harvestPoints, pt = plantingPoints[p,]) 

    #Find the index of the nearest harvest point to p. This is the minimum of Dists. (Note that there may be more than one minimum) 
    NearestHarvest <- which(Dists == min(Dists)) 

    #Add information to the paired data 
    pairedData[p,]<-c(planting[p,]$long, planting[p,]$lat, planting[p,]$variety, planting[p,]$seedling_rate, planting[p,]$seed_spacing, planting[p,]$speed, harvest[NearestHarvest,]$yield) 
    } 

これはあなたが探しているものであれば、私に教えてください。

また、ペアリングされたデータフレームを植え付けデータで初期化することができます。forループでは、収穫したデータをペアデータデータフレームに追加するだけです。これにより、ループの時間を節約できます。

0

収穫ファイル(16626)の各行を、植え付け(6314)ファイルの行にマップする必要があります。下の画像は収穫量と植物のGPS座標をxy平面上にプロットしたものです。赤い点は収穫点です。

Planter Harvester GPS

精密農業機械は、多列プランター&ハーベスタです。 gps装置は機械の内部に収納されています。すなわち、各GPSポイントは、多くの行の作物を指します。この場合、プランターは、旅行ごとにハーベスターに比べて2X行をカバーします。これは、収穫ファイルが〜2X +データポイントを持つ理由を説明します。

gps座標がファイル間で重複しないため、基本的なアプローチはブルートフォース検索です。私は、フィールド全体をより小さな一様なグリッドに分割し、最も近い隣接グリッドに検索を制限することで、RとPythonでこれを解決しました。効率面では、解決には3〜4分かかり、栽培と収穫の間の距離は平均3メートルです。これは合理的です。

私のコードはGithub

です
関連する問題