2016-05-05 7 views
1

Я пытаюсь объединить два набора данных, которые содержат GPS-координаты, так что я остаюсь одним набором данных с переменными из обоих наборов данных. Я пытаюсь использовать функцию для достижения этой цели. Проблема в том, что координаты GPS с обоих наборов данных точно не совпадают. Таким образом, задача заключается в сопоставлении переменных одного набора данных с переменными другого набора данных путем нахождения ближайшего спаривания координат gps.Попытка создать функцию для объединения двух наборов данных по ближайшей координате gps

У меня был успех с пакетом нечетких соединений, но он смог получить частичное совпадение (~ 75%). С приведенной ниже функцией я надеялся получить более высокую степень соответствия. Один набор данных короче другого, поэтому идея заключалась в том, чтобы использовать два для циклов, причем каждый цикл для каждого цикла проходит через каждый набор данных.

Установлен «якорь» (расстояние между первыми наблюдениями обоих наборов данных), так что, если расстояние между двумя точками меньше якоря, новое (более короткое) расстояние становится новым якорем. Цикл for продолжается до тех пор, пока не будет найдено самое короткое расстояние, а переменные из обоих наборов данных будут добавлены к концу нового набора данных, называемого здесь 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 данные короче, чем данные урожая

#need принимать каждую строку данных посадки (6314) и найти ближайшую точку данных урожая (16626), а затем прикрепить

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. Перебирайте только данные о посадке. Сэкономит много времени. Кроме того, не указывайте longlat в spDistsN1, так как ваши данные: SpatialPoints, и функция говорит не указывать для этих объектов.

Пример Loop:

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

Основным подходом является поиск грубой силы, поскольку координаты gps не перекрываются между файлами. Я решил это в R и Python, разделив все поле на более мелкие равномерные сетки и ограничив поиск ближайшими соседними сетками. С точки зрения эффективности требуется ~ 3-4 мин, чтобы решить и имеет в среднем ~ 3 метра в качестве расстояния между посадкой и точками сбора, что является разумным.

Вы можете найти код на моем Github

 Смежные вопросы

  • Нет связанных вопросов^_^