R:如何计算空间点附近的位置数?
R: How to calculate the number of locations nearby a spatial point?
我有一个包含多个项目的数据框+他们的开始日期+他们的坐标(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.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)
现在,我想创建一个新变量 survey$project_nearby 来统计附近的 项目数量(此处:5 公里) 受访者。所以数据框 survey
应该看起来像这样(可能有其他结果):
> survey
respond_id survey_year lat_1 long_1 projects_nearby
1 1 2007 53.780928 9.614991 0
2 2 2005 54.025200 9.349862 0
3 3 2008 53.931432 9.473498 1
4 4 2004 53.881048 10.685581 0
5 5 2005 54.083359 10.026894 0
需要特别注意项目的开工年份和调查年份:如果2007年问受访者,而附近的项目是2008年竣工的,这个项目自然不算附近的项目。
我想创建一个距离矩阵,然后只计算包含小于 5 公里的距离的行数...但我不知道如何创建这个距离矩阵。也许 for 循环会更容易?
谁能帮助我或给我提示,这样做的代码是什么?
编辑:我编辑了 survey$projects_nearby 的预期值。现在这些值应该与位于各自受访者附近的实际项目数量相匹配。
我认为您必须将纬度、经度坐标转换为平面坐标,或者使用下面的 link 来自之前的 post:
harvesine distance
一旦您确定了到项目数据框中特定位置的距离,您可能需要使用 knn
或您喜欢的任何其他技术来查找 similar
个点。
您可以使用 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))
希望对您有所帮助!
编辑:
很抱歉没有考虑日期。
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))
我不认为显示的是正确答案?下面我按年份 left_join
,以便每个匹配 projects
的 survey
的每一行都将被复制。然后我过滤到纬度低于 5 公里的行。计算它们并返回原始调查。
由于同一年的项目 1 和 2 在同一位置,结果也有些混乱。我用这段代码数了两次。
>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
.. 如果合适,您当然可以将 NA 更改为零...
我有一个包含多个项目的数据框+他们的开始日期+他们的坐标(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.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)
现在,我想创建一个新变量 survey$project_nearby 来统计附近的 项目数量(此处:5 公里) 受访者。所以数据框 survey
应该看起来像这样(可能有其他结果):
> survey
respond_id survey_year lat_1 long_1 projects_nearby
1 1 2007 53.780928 9.614991 0
2 2 2005 54.025200 9.349862 0
3 3 2008 53.931432 9.473498 1
4 4 2004 53.881048 10.685581 0
5 5 2005 54.083359 10.026894 0
需要特别注意项目的开工年份和调查年份:如果2007年问受访者,而附近的项目是2008年竣工的,这个项目自然不算附近的项目。
我想创建一个距离矩阵,然后只计算包含小于 5 公里的距离的行数...但我不知道如何创建这个距离矩阵。也许 for 循环会更容易? 谁能帮助我或给我提示,这样做的代码是什么?
编辑:我编辑了 survey$projects_nearby 的预期值。现在这些值应该与位于各自受访者附近的实际项目数量相匹配。
我认为您必须将纬度、经度坐标转换为平面坐标,或者使用下面的 link 来自之前的 post:
harvesine distance
一旦您确定了到项目数据框中特定位置的距离,您可能需要使用
knn
或您喜欢的任何其他技术来查找 similar
个点。
您可以使用 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))
希望对您有所帮助!
编辑:
很抱歉没有考虑日期。
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))
我不认为显示的是正确答案?下面我按年份 left_join
,以便每个匹配 projects
的 survey
的每一行都将被复制。然后我过滤到纬度低于 5 公里的行。计算它们并返回原始调查。
由于同一年的项目 1 和 2 在同一位置,结果也有些混乱。我用这段代码数了两次。
>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
.. 如果合适,您当然可以将 NA 更改为零...