我才刚开始使用R和空间分析,所以我缺少很多基础知识!
我的数据包含学校地址。我想为每所学校计算到最近学校的距离。我的数据还包含有关学校“特殊功能”的信息。此变量(sps)编码为1(“具有特殊功能”)或0(“无特殊功能”)。我想计算从“具有特殊功能”的学校到“无特殊功能”的学校的距离。这是我的数据的样子:
head(data01)
id lon lat sps
1 11725 6.932546 50.38269 0
2 11739 6.975160 50.48649 1
3 26883 6.987575 50.50857 0
到目前为止,我设法使用st_distance命令和以下代码来计算到最近学校的距离。不幸的是,在使用此代码时,在某些情况下,最近的学校都具有“特殊功能”。我只想要1-> 0或0-> 1的距离,而不是1-> 1!
my_sf <- st_as_sf(data01,
coords = c("lon", "lat"), # x, y (order matters)
crs = 4326)
dist.mat <- st_distance(my_sf) # Great Circle distance since in lat/lon
# Number within 1.5km: Subtract 1 to exclude the point itself
num.1500 <- apply(dist.mat, 1, function(x) {
sum(x < 1500) - 1
})
# Calculate nearest distance
nn.dist <- apply(dist.mat, 1, function(x) {
return(sort(x, partial = 2)[2])
})
# Get index for nearest distance
nn.index <- apply(dist.mat, 1, function(x) { order(x, decreasing=F)[2] })
n.data <- data01
colnames(n.data)[1] <- "neighbor"
colnames(n.data)[2:ncol(n.data)] <-
paste0("n.", colnames(n.data)[2:ncol(n.data)])
mydata2 <- data.frame(data01,
n.data[nn.index, ],
n.distance = nn.dist,
radius1500 = num.1500)
rownames(mydata2) <- seq(nrow(mydata2))
感谢您的帮助!
欢呼声,k
(毕达哥拉斯)上两点之间距离的公式:
sqrt( (x1-x2)**2 + (y1-y2)**2)
我们可以创建一个函数来对其进行计算(您可以为library(magrittr)
运算符调用%>%
:]
dist = function(x1,x2,y1,y2){
sqrt( (x1-x2)**2 + (y1-y2)**2) %>% return()
}
创建条件变量(只是为了使其看起来更好-如果需要,可以内联它)
condition = data01$sps %>% as.logical()
现在我们可以使用lapply
:
lapply(1:nrow(data01), function(x){
if(condition[x]){
dist(data01$lon[!condition],
data01$lon[x],
data01$lat[!condition],
data01$lat[x])
}else{
dist(data01$lon[condition],
data01$lon[x],
data01$lat[condition],
data01$lat[x])
}
}) %>% do.call()
该代码未经测试,但是它应该产生一个向量列表,每个向量都应给出具有相反sps值的学校的距离。第一个向量将对应于第一行,等等。此外,该解决方案还保留了邻居的顺序,因此向量中的第一个距离将始终对应于相反sps组中的第一个邻居。