计算居住在距医院一定距离以内或以外的人数
Calculating the number of people who live within or outside a certain distance from hospitals
我是地理空间统计的新手,想不出一个简单的问题:
我有两个具有空间坐标的数据集。一个有特定地区的医院和诊所的坐标。另一个有该地区所有家庭的坐标。
这是一些模拟数据
hospital_coord <-data.frame(longitude = c(80.15998, 72.89125, 77.65032, 77.60599),
latitude = c(12.90524, 19.08120, 12.97238, 12.90927))
people_coord <-data.frame(longitude = c(72.89537, 77.65094, 73.95325, 72.96746,
77.65058, 77.66715, 77.64214, 77.58415,
77.76180, 76.65470, 76.65480, 76.65490, 76.65500, 76.65560, 76.65560),
latitude = c(19.07726, 13.03902, 18.50330, 19.16764,
12.90871, 13.01693, 13.00954, 12.92079,
13.02212, 12.81447, 12.81457, 12.81467, 12.81477, 12.81487, 12.81497))
我想计算以下内容:
- 有多少家庭住在距离最近的地方超过 2 公里的地方 clinic/hospital
- 在数据框中创建一个列,指示哪些家庭在 2 公里距离之内或之外
我认为这可以满足您的要求,使用链接问题中更新的 sf
包而不是 geosphere
。做法如下:
- 使用
st_as_sf
将 latitude/longitude 点转换为几何对象
- 将坐标参考系设置为标准long/lat,因为数据位于long/lat(这是WGS84)
- 使用
st_distance
计算每个人与每个医院之间的距离 units
table,以米为单位。
- 将
units
table 转换为常规 tbl
,因为处理起来很麻烦,并检查哪些对的间距超过 2 公里
- 使用
mutate_at
检查每一行,看看每家医院是小于2公里(T
)还是大于2公里(F
)
- 最后,用
pmap
和any
检查每一行,看看2公里内是否至少家医院!
看来只有第一个病人在医院的 2 公里范围内。
library(tidyverse)
library(sf)
hospital <- tibble(
longitude = c(80.15998, 72.89125, 77.65032, 77.60599),
latitude = c(12.90524, 19.08120, 12.97238, 12.90927)
)
people <- tibble(
longitude = c(72.89537, 77.65094, 73.95325, 72.96746, 77.65058,
77.66715, 77.64214, 77.58415, 77.76180, 76.65470,
76.65480, 76.65490, 76.65500, 76.65560, 76.65560),
latitude = c(19.07726, 13.03902, 18.50330, 19.16764, 12.90871,
13.01693, 13.00954, 12.92079, 13.02212, 12.81447,
12.81457, 12.81467, 12.81477, 12.81487, 12.81497)
)
hospital_sf <- hospital %>%
st_as_sf(coords = c("longitude", "latitude")) %>%
st_set_crs(4326)
people_sf <- people %>%
st_as_sf(coords = c("longitude", "latitude")) %>%
st_set_crs(4326)
distances <- st_distance(people_sf, hospital_sf) %>%
as_tibble() %>%
mutate_at(vars(V1:V4), as.numeric) %>%
mutate_at(vars(V1:V4), function (x) x > 2000) %>%
mutate(within_2km = pmap_lgl(., function(V1, V2, V3, V4) any(V1, V2, V3, V4)))
# A tibble: 15 x 5
V1 V2 V3 V4 within_2km
<lgl> <lgl> <lgl> <lgl> <lgl>
1 T F T T T
2 T T T T F
3 T T T T F
4 T T T T F
5 T T T T F
6 T T T T F
7 T T T T F
8 T T T T F
9 T T T T F
10 T T T T F
11 T T T T F
12 T T T T F
13 T T T T F
14 T T T T F
15 T T T T F
我是地理空间统计的新手,想不出一个简单的问题:
我有两个具有空间坐标的数据集。一个有特定地区的医院和诊所的坐标。另一个有该地区所有家庭的坐标。
这是一些模拟数据
hospital_coord <-data.frame(longitude = c(80.15998, 72.89125, 77.65032, 77.60599),
latitude = c(12.90524, 19.08120, 12.97238, 12.90927))
people_coord <-data.frame(longitude = c(72.89537, 77.65094, 73.95325, 72.96746,
77.65058, 77.66715, 77.64214, 77.58415,
77.76180, 76.65470, 76.65480, 76.65490, 76.65500, 76.65560, 76.65560),
latitude = c(19.07726, 13.03902, 18.50330, 19.16764,
12.90871, 13.01693, 13.00954, 12.92079,
13.02212, 12.81447, 12.81457, 12.81467, 12.81477, 12.81487, 12.81497))
我想计算以下内容:
- 有多少家庭住在距离最近的地方超过 2 公里的地方 clinic/hospital
- 在数据框中创建一个列,指示哪些家庭在 2 公里距离之内或之外
我认为这可以满足您的要求,使用链接问题中更新的 sf
包而不是 geosphere
。做法如下:
- 使用
st_as_sf
将 latitude/longitude 点转换为几何对象
- 将坐标参考系设置为标准long/lat,因为数据位于long/lat(这是WGS84)
- 使用
st_distance
计算每个人与每个医院之间的距离units
table,以米为单位。 - 将
units
table 转换为常规tbl
,因为处理起来很麻烦,并检查哪些对的间距超过 2 公里 - 使用
mutate_at
检查每一行,看看每家医院是小于2公里(T
)还是大于2公里(F
) - 最后,用
pmap
和any
检查每一行,看看2公里内是否至少家医院!
看来只有第一个病人在医院的 2 公里范围内。
library(tidyverse)
library(sf)
hospital <- tibble(
longitude = c(80.15998, 72.89125, 77.65032, 77.60599),
latitude = c(12.90524, 19.08120, 12.97238, 12.90927)
)
people <- tibble(
longitude = c(72.89537, 77.65094, 73.95325, 72.96746, 77.65058,
77.66715, 77.64214, 77.58415, 77.76180, 76.65470,
76.65480, 76.65490, 76.65500, 76.65560, 76.65560),
latitude = c(19.07726, 13.03902, 18.50330, 19.16764, 12.90871,
13.01693, 13.00954, 12.92079, 13.02212, 12.81447,
12.81457, 12.81467, 12.81477, 12.81487, 12.81497)
)
hospital_sf <- hospital %>%
st_as_sf(coords = c("longitude", "latitude")) %>%
st_set_crs(4326)
people_sf <- people %>%
st_as_sf(coords = c("longitude", "latitude")) %>%
st_set_crs(4326)
distances <- st_distance(people_sf, hospital_sf) %>%
as_tibble() %>%
mutate_at(vars(V1:V4), as.numeric) %>%
mutate_at(vars(V1:V4), function (x) x > 2000) %>%
mutate(within_2km = pmap_lgl(., function(V1, V2, V3, V4) any(V1, V2, V3, V4)))
# A tibble: 15 x 5
V1 V2 V3 V4 within_2km
<lgl> <lgl> <lgl> <lgl> <lgl>
1 T F T T T
2 T T T T F
3 T T T T F
4 T T T T F
5 T T T T F
6 T T T T F
7 T T T T F
8 T T T T F
9 T T T T F
10 T T T T F
11 T T T T F
12 T T T T F
13 T T T T F
14 T T T T F
15 T T T T F