计算住在医院一定距离内或外的人数

时间:2018-02-08 09:27:52

标签: r geospatial

我是地理空间统计数据的新手,无法找出一个简单的问题:

我有两个带空间坐标的数据集。一个具有特定地区的医院和诊所的坐标。另一个是该地区所有家庭的坐标。

这是一些模拟数据

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公里的家庭比例是多少百分比
  • 在数据框中创建一个列,指示哪些住户在2公里距离内或之外

1 个答案:

答案 0 :(得分:1)

我认为这可以做到你想要的,使用最新的sf包而不是链接问题中的geosphere。方法如下:

  1. 使用st_as_sf
  2. 将纬度/经度点转换为几何对象
  3. 将坐标参考系统设置为标准长/纬度,因为数据为长/纬(这是WGS84)
  4. 使用st_distance计算每个人与每家医院之间的距离units表,以米为单位。
  5. units表转换为常规tbl,因为处理很麻烦,并检查哪些对的间隔超过2公里
  6. 使用mutate_at检查每一行,看看每家医院是否距离不到2公里(T)或距离超过2公里(F
  7. 最后,使用pmapany检查每一行,看看至少一家医院是否在2公里范围内!
  8. 看起来只有第一位患者在医院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