查找R中数据点的一定半径内的点数

问题描述 投票:0回答:1

我有2个数据集,一个用于医院,另一个用于程序。每个数据集都有纬度和经度坐标。手术可以在医院内进行,也可以在医院外进行,但是如果在医院中进行,坐标不一定是精确的。我试图在每个医院周围形成一定大小的半径,并确定平均有多少手术点落入该半径内。因此,例如,如果我有100家医院和3000个程序,我想在所有医院周围形成一个半径,并查看平均有多少家医院落入该指定半径。我的初始代码如下,但是我知道可以更快地完成。用R编码。谢谢!

for(i in 1:NROW(hospitals)){
  hospital <- hospitals[i,]
  radius <- .016

  # find all the procedures that lie in the .016 sized radius from this hospital

  hospital$latitude_low <- hospital$lat - radius
  hospital$longitude_low <- hospital$long - radius
  hospital$latitude_high <- hospital$lat + radius
  hospital$longitude_high <- hospital$long + radius

  in_rad <- procedures[(procedures$long >= hospital$longitude_low & procedures$long <= 
  hospital$longitude_high & procedures$lat <= hospital$latitude_high & procedures$lat >= 
  hospital$latitude_low),]

  num <- NROW(in_rad)
  hospitals[i,]$number_of_procedures <- num
}
r geospatial raster geosphere
1个回答
0
投票

这里有几处可以改进的地方。首先,您实际上并不是在计算距离医院0.16个单位半径内执行的过程,而是计算以医院为中心在0.32 * 0.32个单位平方内进行的过程。对于特定的问题来说可能不是什么大问题,但实际上可以更快地找出特定距离内的点。

其次,即使您只打算使用它们一次,也倾向于存储计算出的所有变量。这可以帮助理解代码,但是有时效率较低,并且肯定会使代码更长,特别是如果您喜欢使用long_descriptive_variable_names

第三,最后,您对procedures进行了子集,然后测量了行数,而不仅仅是使用子集本身的长度。

最后(但不太重要),您一次将结果写入一个值到新列中。您可以使用sapply一口气完成所有操作。

所以您的代码应类似于:

hospitals$number_of_procedures <- sapply(1:NROW(hospitals), function(i)
  {
    d <- procedures$long - hospitals[i,]$long)^2 + (procedures$lat - hospitals[i,]$lat)^2
    length(which(d < 0.16^2))
  })
© www.soinside.com 2019 - 2024. All rights reserved.