R:如何计算空间点附近的位置数?
我有一个数据框,其中包含多个项目+它们的开始日期+它们的坐标(long/lat),我有一个数据框,其中包含多个(虚构的)受访者+他们被调查的日期+他们的坐标:R:如何计算空间点附近的位置数?,r,for-loop,spatial,distance-matrix,R,For Loop,Spatial,Distance Matrix,我有一个数据框,其中包含多个项目+它们的开始日期+它们的坐标(long/lat),我有一个数据框,其中包含多个(虚构的)受访者+他们被调查的日期+他们的坐标: respond_id<- c(1:5) survey_year<- c(2007, 2005, 2008, 2004, 2005) lat_1<- c(53.780928, 54.025200, 53.931432, 53.881048, 54.083359) long_1<- c(9.614991, 9.3498
respond_id<- c(1:5)
survey_year<- c(2007, 2005, 2008, 2004, 2005)
lat_1<- c(53.780928, 54.025200, 53.931432, 53.881048, 54.083359)
long_1<- c(9.614991, 9.349862, 9.473498, 10.685581, 10.026894)
project_id<- c(1111:1114)
year_start<- c(2007, 2007, 2006, 2008)
lat_2<- c(54.022881, 54.022881, 53.931753, 53.750523)
long_2<- c(9.381104, 9.381104, 9.505700, 9.666336)
survey<- data.frame(respond_id, survey_year, lat_1, long_1)
projects<- data.frame(project_id, year_start, lat_2, long_2)
需要特别注意项目的开始年份和进行调查的年份:如果在2007年询问了受访者,但附近的项目在2008年完成,该项目自然不算作附近的项目
我想创建一个距离矩阵,然后只计算距离小于5公里的行数。。。但我不知道如何创建这个距离矩阵。也许for循环会更容易些?
谁能帮我一下或给我一个提示,做这个的代码是什么
编辑:我编辑了调查$projects\u的预期值。现在,这些值应该与相应受访者附近的实际项目数量相匹配。我认为您必须将lat、long坐标转换为平面坐标,或者使用上一篇文章中的以下链接:
https://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula
一旦您在项目数据框中有到特定位置的距离,您可能需要使用
knn
或您喜欢的任何其他技术来查找类似的点。您可以使用sp
包来查找距离,然后只需计算附近的数字。就是
library(sp)
survey.loc <- matrix(as.numeric(as.character(unlist(survey[, 3:4]))), ncol = 2)
project.loc <- matrix(as.numeric(as.character(unlist(projects[, 3:4]))), ncol = 2)
distances <- spDists(survey.loc, project.loc, longlat = TRUE)
survey$project_nearby <- apply(distances, 1, function(x) sum(x<5))
库(sp)
survey.loc我不认为正确答案是这样的?下面我将按年度加入,以便为每个匹配的项目复制调查的每一行。然后我过滤到LAT低于5公里的行。数一数,然后重新加入原始调查
由于同一年的project1和Project2位于同一位置,结果也有点混乱。我用这个密码数两次
>survey
respond_id survey_year lat_1 long_1
1 1 2007 53.78093 9.614991
2 2 2005 54.02520 9.349862
3 3 2008 53.93143 9.473498
4 4 2004 53.88105 10.685581
5 5 2005 54.08336 10.026894
>projects
> projects
project_id year_start lat_2 long_2
1 1111 2007 54.02288 9.381104
2 1112 2007 54.02288 9.381104
3 1113 2006 53.93175 9.505700
4 1114 2008 53.75052 9.666336
> left_join(survey, projects, by = c( "survey_year"="year_start")) %>%
+ dplyr::filter( sqrt((lat_1-lat_2)^2 + (long_1-long_2)^2 ) < 5) %>%
+ group_by(respond_id, survey_year, lat_1, long_1) %>%
+ summarise(projects_nearby = n()) %>%
+ right_join(survey)
Joining, by = c("respond_id", "survey_year", "lat_1", "long_1")
Source: local data frame [5 x 5]
Groups: respond_id, survey_year, lat_1 [?]
respond_id survey_year lat_1 long_1 projects_nearby
<int> <dbl> <dbl> <dbl> <int>
1 1 2007 53.78093 9.614991 2
2 2 2005 54.02520 9.349862 NA
3 3 2008 53.93143 9.473498 1
4 4 2004 53.88105 10.685581 NA
5 5 2005 54.08336 10.026894 NA
>调查
答复身份调查最近一年长
1 1 2007 53.78093 9.614991
2 2 2005 54.02520 9.349862
3 3 2008 53.93143 9.473498
4 4 2004 53.88105 10.685581
5 5 2005 54.08336 10.026894
>计划
>计划
项目id年份开始时间长2
1 1111 2007 54.02288 9.381104
2 1112 2007 54.02288 9.381104
3 1113 2006 53.93175 9.505700
4 1114 2008 53.75052 9.666336
>左加入(调查,项目,由=c(“调查年”=“年开始”))%>%
+dplyr::过滤器(sqrt((lat_1-lat_2)^2+(long_1-long_2)^2)<5)%
+分组依据(答复id、调查年份、时间1、时间1)%>%
+总结(项目_=n())%>%
+右联合(调查)
加入,由=c(“回复id”、“调查年份”、“lat\U 1”、“long\U 1”)
来源:本地数据帧[5 x 5]
组:答复id、调查年份、lat 1[?]
响应id调查\u一年前\u 1长\u 1项目\u附近
1 1 2007 53.78093 9.614991 2
2 2005 54.02520 9.349862 NA
3 3 2008 53.93143 9.473498 1
4 4 2004 53.88105 10.685581 NA
5 5 2005 54.08336 10.026894 NA
。。当然,如果合适,您可以将NA更改为零…OP,您希望距离为crow fly distance还是network distance?如果是后者,您可能需要检查GoogleMaps距离矩阵api和googleway R包来执行此操作。然后在df加入步骤之后,按照@Stephen Henderson的回答进行操作。非常感谢,这非常简单,效果非常好!然而,我认为代码不考虑日期变量,这意味着项目被记录在附近,即使在调查相应的受访者时项目并不存在。但我可以通过相应地对数据集进行子集来解决这个问题。
library(sp)
survey.loc <- matrix(as.numeric(as.character(unlist(survey[, 3:4]))), ncol = 2)
project.loc <- matrix(as.numeric(as.character(unlist(projects[, 3:4]))), ncol = 2)
distances <- spDists(survey.loc, project.loc, longlat = TRUE)
year.diff <- sapply(projects$year_start, function(x) survey$survey_year-x)
year.diff <- ifelse(year.diff < 0, Inf, 1)
survey$project_nearby <- apply(year.diff*distances, 1, function(x) sum(x<5))
>survey
respond_id survey_year lat_1 long_1
1 1 2007 53.78093 9.614991
2 2 2005 54.02520 9.349862
3 3 2008 53.93143 9.473498
4 4 2004 53.88105 10.685581
5 5 2005 54.08336 10.026894
>projects
> projects
project_id year_start lat_2 long_2
1 1111 2007 54.02288 9.381104
2 1112 2007 54.02288 9.381104
3 1113 2006 53.93175 9.505700
4 1114 2008 53.75052 9.666336
> left_join(survey, projects, by = c( "survey_year"="year_start")) %>%
+ dplyr::filter( sqrt((lat_1-lat_2)^2 + (long_1-long_2)^2 ) < 5) %>%
+ group_by(respond_id, survey_year, lat_1, long_1) %>%
+ summarise(projects_nearby = n()) %>%
+ right_join(survey)
Joining, by = c("respond_id", "survey_year", "lat_1", "long_1")
Source: local data frame [5 x 5]
Groups: respond_id, survey_year, lat_1 [?]
respond_id survey_year lat_1 long_1 projects_nearby
<int> <dbl> <dbl> <dbl> <int>
1 1 2007 53.78093 9.614991 2
2 2 2005 54.02520 9.349862 NA
3 3 2008 53.93143 9.473498 1
4 4 2004 53.88105 10.685581 NA
5 5 2005 54.08336 10.026894 NA