Ich versuche, zwei Datensätze, die GPS-Koordinaten enthalten, so dass ich mit einem Dataset mit Variablen aus beiden Datensätze zusammengeführt bin. Ich versuche, eine Funktion zu verwenden, um dies zu erreichen. Das Problem ist, dass die GPS-Koordinaten von beiden Datensätzen nicht genau übereinstimmen. Die Aufgabe besteht also darin, die Variablen eines Datensatzes mit den Variablen des anderen Datensatzes zu vergleichen, indem die engste Paarung der GPS-Koordinaten gefunden wird.Versuchen, eine Funktion zu erstellen, um zwei Datensätze durch die nächstgelegene GPS-Koordinate zu verbinden
Ich hatte Erfolg mit dem Fuzzy-Join-Paket, konnte aber nur teilweise Übereinstimmung (~ 75%) erhalten. Mit der unten stehenden Funktion hoffte ich, einen höheren Übereinstimmungsgrad zu erreichen. Ein Datensatz ist kürzer als der andere, daher bestand die Idee darin, zwei for-Schleifen zu verwenden, wobei jede for-Schleife durch jeden Datensatz geht.
Ein "Anker" (Abstand zwischen den ersten Beobachtungen beider Datensätze) wird festgelegt, so dass der neue (kürzere) Abstand der neue Anker wird, wenn der Abstand zwischen den beiden Punkten kleiner als der Anker ist. Die for-Schleife wird fortgesetzt, bis die kürzeste Entfernung gefunden wurde, und die Variablen aus beiden Datensätzen werden an das Ende eines neuen Datensatzes angehängt, der hier als pairedData bezeichnet wird. Ich sollte mit einem Datensatz belassen werden, solange der kürzeste Datensatz (6314 Zeilen) mit Daten aus beiden Datensätzen verwendet wurde.
Ich denke, die Funktion sollte funktionieren, aber rbind() ist super langsam, und ich habe Probleme bei der Implementierung von rbindlist(). Irgendwelche Ideen, wie ich das erreichen könnte?
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 Daten kürzer als Erntedaten
#need jede Reihe von Pflanzdaten zu nehmen (6314) und am nächsten Ernte Datenpunkt (16626) finden, dann bringen
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