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