我有两组积分,set1
和set2
。两组点都有与该点相关的数据。 set1中的点是"短暂的",并且仅存在于给定日期。 set2中的点是" permanent",是在给定日期构建的,然后在该日期之后永久存在。
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(短暂)中的每个点,找到在事件发生1之前构造的set2(永久)中最近点的距离。例如,set1中的第一个点发生在2011-03-18:
> set1[1,]
lat lon date
1 40.26551 -69.93529 2011-03-18
所以我想找到在2011-03-18之前构建的set2中的最近点:
> 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)
我的问题是,如果set2(距离矩阵列)中的点是在set1(距离矩阵行)中的点之后构建的,那么如何将此矩阵中的距离调整为Inf
?
答案 0 :(得分:3)
以下是我要做的事情:
earlierMatrix <- outer(set1$date, set2$date, "<=")
distMatrix2 <- distMatrix + ifelse(earlierMatrix, Inf, 0)
答案 1 :(得分:0)
这是我尝试回答的问题。它不是特别有效,但我认为这是正确的。它还允许您轻松地在不同的距离计算器中进行分析:
#Calculate distances
require(fields)
distMatrix <- lapply(1:nrow(set1),function(x) {
#Find distances to all points
distances <- rdist.earth(set1[x,c('lon','lat')], set2[,c('lon','lat')], miles = TRUE)
#Set distance to Inf if the set1 point occured BEFORE the set2 dates
distances <- ifelse(set1[x,'date']<set2[,'date'], Inf, distances)
return(distances)
})
distMatrix <- do.call(rbind,distMatrix)
#Find distance to closest object
set1$dist <- apply(distMatrix,1,min)
#Find id of closest object
objectID <- lapply(1:nrow(set1),function(x) {
if (set1[x,'dist']<Inf) {
IDs <- which(set1[x,'dist']==distMatrix[x,])
} else {
IDs <- NA
}
return(sample(IDs,1)) #Randomly break ties (if there are any)
})
set1$objectID <- do.call(rbind,objectID)
以下是结果数据集的开头:
> head(set1)
lat lon date dist objectID
1 40.26551 -69.93529 2011-03-18 3.215514 13
2 40.37212 -69.32339 2011-02-11 10.320910 46
3 40.57285 -69.26463 2011-02-23 3.954132 4
4 40.90821 -69.88870 2011-04-24 4.132536 49
5 40.20168 -69.95335 2011-02-24 4.284692 45
6 40.89839 -69.86909 2011-07-12 3.385769 57