我有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
}
这里有几处可以改进的地方。首先,您实际上并不是在计算距离医院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))
})