使用R中的纬度和经度计算观测值
诺布问题。我想不出这个代码有什么问题。我试图找出在半径为400米的圆圈内发生的观测次数。我对每一次观察都有一个lat和long。我正在尝试创建一个新的专栏,显示半径为400米的圆圈内竞争餐厅的数量。我包括了我正在使用的代码的数据示例,以及数据帧的STR。提前谢谢使用R中的纬度和经度计算观测值,r,R,诺布问题。我想不出这个代码有什么问题。我试图找出在半径为400米的圆圈内发生的观测次数。我对每一次观察都有一个lat和long。我正在尝试创建一个新的专栏,显示半径为400米的圆圈内竞争餐厅的数量。我包括了我正在使用的代码的数据示例,以及数据帧的STR。提前谢谢 for (i in seq(nrow(expandedDataFrame2))) { # circle's centre xcentre <- df[i,'latitude'] ycentre <- df[i,'
for (i in seq(nrow(expandedDataFrame2)))
{
# circle's centre
xcentre <- df[i,'latitude']
ycentre <- df[i,'longitude']
# checking how many restaurants lie within 400 m of the above centre, noofcloserest column will contain this value
expandedDataFrame2[i,'noofcloserest'] <- sum(
(expandedDataFrame2[,'latitude'] - xcentre)^2 +
(expandedDataFrame2[,'longitude'] - ycentre)^2
<= 400^2
) - 1
# logging part for deeper analysis
cat(i,': ')
cat((expandedDataFrame2[,'latitude'] - xcentre)^2 +
(expandedDataFrame2[,'longitude'] - ycentre)^2
<= 400^2)
cat('\n')
}
这里有一种方法,它使用包
sp
中的函数spDistsN1(…)
。调用数据帧df
library(sp)
get.dists <- function(i) {
ref.pt <- with(df[i,],c(longitude,latitude))
points <- as.matrix(with(df[-i,],cbind(longitude,latitude)))
dists <- spDistsN1(points, ref.pt, longlat=T)
return(length(which(dists<0.4)))
}
df$count <- sapply(1:nrow(df),get.dists)
库(sp)
get.dists您可以发布一个(最小)可复制的示例吗?我会围绕你的中心画一个400米的圆,并使用sp
包中的函数(比如points.in.polygon
)来计算这个圆内的点数。你不会真的期望在lat long degrees上使用毕达哥拉斯距离公式会得到以米为单位的距离,是吗?或者使用一个具有特定地球半径的大圆距离函数,或者如果您的点位于一个小区域,则将其投影到UTM网格系统。太棒了!谢谢你也解释了功能中正在发生的事情。这对帮助像我这样的傻瓜来说是很有帮助的。
str(expandeddataframe2)
'data.frame': 2833 obs. of 28 variables:
$ business_id : chr "--5jkZ3-nUPZxUvtcbr8Uw" "--BlvDO_RG2yElKu9XA1_g" "-_Ke8q969OAwEE_-U0qUjw" "-_npP9XdyzILAjtFfX8UAQ" ...
$ restaurantType: chr "Greek" "Sushi Bars" "Beer, Wine & Spirits" "Vietnamese" ...
$ full_address : chr "1336 N Scottsdale Rd\nScottsdale, AZ 85257" "14870 N Northsight Blvd\nSte 103\nScottsdale, AZ 85260" "18555 N 59th Ave\nGlendale, AZ 85308" "6025 N 27th Avenue\nSte 24\nPhoenix, AZ 85073" ...
$ open : Factor w/ 2 levels "0","1": 2 2 1 2 2 2 2 2 2 2 ...
$ city : chr "Scottsdale" "Scottsdale" "Glendale" "Phoenix" ...
$ review_count : num 11 37 6 15 4 145 255 35 7 7 ...
$ name : chr "George's Gyros Greek Grill" "Asian Island" "Jug 'n Barrel Wine Shop" "Thao's Sandwiches" ...
$ longitude : num -112 -112 -112 -112 -112 ...
$ state : chr "AZ" "AZ" "AZ" "AZ" ...
$ stars : num 4.5 4 4.5 3 4 3.5 4.5 4 2.5 4.5 ...
$ latitude : num 33.5 33.6 33.7 33.4 33.6 ...
$ type : chr "business" "business" "business" "business" ...
$ categories1 : chr "Greek" "Sushi Bars" NA "Vietnamese" ...
$ categories2 : chr NA "Hawaiian" "Beer, Wine & Spirits" "Sandwiches" ...
$ categories3 : chr NA "Chinese" NA NA ...
$ categories4 : chr NA NA NA NA ...
$ categories5 : chr NA NA NA NA ...
$ categories6 : chr NA NA NA NA ...
$ categories7 : chr NA NA NA NA ...
$ categories8 : chr NA NA NA NA ...
$ categories9 : chr NA NA NA NA ...
$ categories10 : chr NA NA NA NA ...
$ isRestaurant : logi TRUE TRUE TRUE TRUE TRUE TRUE ...
$ Freq : num 66 58 8 44 166 166 98 35 45 166 ...
$ avgRev : num [1:2833(1d)] 31.3 68.6 34.3 63.2 30.8 ...
..- attr(*, "dimnames")=List of 1
.. ..$ : chr "Greek" "Sushi Bars" "Beer, Wine & Spirits" "Vietnamese" ...
$ avgStar : num [1:2833(1d)] 3.69 3.66 3.56 3.58 3.48 ...
..- attr(*, "dimnames")=List of 1
.. ..$ : chr "Greek" "Sushi Bars" "Beer, Wine & Spirits" "Vietnamese" ...
$ duration :Class 'difftime' atomic [1:2833] 381 690 604 1916 226 ...
.. ..- attr(*, "units")= chr "days"
$ delta : num 0 0 1 0 0 0 0 0 0 0 ...
library(sp)
get.dists <- function(i) {
ref.pt <- with(df[i,],c(longitude,latitude))
points <- as.matrix(with(df[-i,],cbind(longitude,latitude)))
dists <- spDistsN1(points, ref.pt, longlat=T)
return(length(which(dists<0.4)))
}
df$count <- sapply(1:nrow(df),get.dists)