У меня есть 2 набора точек, set1
и set2
. Оба набора точек имеют данные, связанные с точкой. Точки в set1 являются «эфемерными» и существуют только на данную дату. Точки в set2 являются «постоянными», строятся в заданную дату, а затем существуют навсегда после этой даты.Поиск ближайшего соседа между двумя наборами датированных точек
set.seed(1)
dates <- seq(as.Date('2011-01-01'),as.Date('2011-12-31'),by='days')
set1 <- data.frame(lat=40+runif(10000),
lon=-70+runif(10000),date=sample(dates,10000,replace=TRUE))
set2 <- data.frame(lat=40+runif(100),
lon=-70+runif(100),date=sample(dates,100,replace=TRUE))
Вот моя проблема: Для каждой точки в set1 (эфемерный) найти расстояние до ближайшей точки в set2 (постоянный), который был построен перед событием set1 произошло. Например, первый пункт в set1 произошло 2011-03-18:
> set1[1,]
lat lon date
1 40.26551 -69.93529 2011-03-18
Так что я хочу, чтобы найти ближайший пункт в set2, который был построен до того 2011-03-18:
> head(set2[set2$date<=as.Date('2011-04-08'),])
lat lon date
1 40.41531 -69.25765 2011-02-18
7 40.24690 -69.29812 2011-02-19
13 40.10250 -69.52515 2011-02-12
14 40.53675 -69.28134 2011-02-27
17 40.66236 -69.07396 2011-02-17
20 40.67351 -69.88217 2011-01-04
Дополнительная морщина заключается в том, что это точки широты/долготы, поэтому я должен рассчитать расстояния вдоль поверхности земли. Пакет R fields обеспечивает convienent function сделать это:
require(fields)
distMatrix <- rdist.earth(set1[,c('lon','lat')],
set2[,c('lon','lat')], miles = TRUE)
Мой вопрос, как я могу настроить расстояния в этой матрице для Inf
, если точка в set2 (столбце матрицы расстояний) была построена после точки set1 (строка матрицы расстояний)?
Очень элегантный. Спасибо! 1 небольшая ошибка: у вас есть оператор 'ifelse'. Если set1 $ date
Zach
Спасибо, и хороший улов. Должен быть очень осторожным, когда код начинает получать этот компакт! Другое решение сделать, хотите ли вы использовать '' <"' или '" <"' ... Я отредактировал его для '' <= "', так как это строго подразумевается в разделе «ПЕРЕД» в вашем вопросе ;) –
Yup, это тоже работает. Спасибо за помощь! – Zach