我是地理空间统计数据的新手,无法找出一个简单的问题:
我有两个带空间坐标的数据集。一个具有特定地区的医院和诊所的坐标。另一个是该地区所有家庭的坐标。
这是一些模拟数据
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))
我想计算以下内容:
答案 0 :(得分:1)
我认为这可以做到你想要的,使用最新的sf
包而不是链接问题中的geosphere
。方法如下:
st_as_sf
st_distance
计算每个人与每家医院之间的距离units
表,以米为单位。units
表转换为常规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