【问题标题】:R - Disaggregate coverage area data based on a ranking preferenceR - 根据排名偏好分解覆盖区域数据
【发布时间】:2016-09-30 12:01:11
【问题描述】:

我拥有英国地方当局级别的 4G 移动覆盖范围,占覆盖地理区域的百分比(大约 200 个区域)。我想分解这些数据,以便可以处理大约 9000 个较低级别的邮政编码部门。

对我来说,最合适的方式是首先将 4G 地理覆盖范围分配到人口最稠密的地区,因为这最能代表移动运营商在市场上的投资方式。人口最少的地区最终将没有覆盖。但是,我正在为如何在 R 中做到这一点而苦苦挣扎。

我有一个看起来像这样的邮政编码扇区数据的数据框(我在这里使用了假设数据):

Name      pcd.sect  pop    area pop.dens  rank  
Cambridge   1      5546    0.6   8341      1     
Cambridge   2      7153    1.1   5970      2     
Cambridge   3      5621    2.3   5289      3     
Cambridge   4      10403   4.3   4361      4     
Cambridge   5      14796   4.2   3495      5     
...

然后,我将汇总的地方当局数据放在每一行(添加右三列):

Name      pcd.sect  pop    area pop.dens  rank  LA.4G  LA.area   LA.4G(km2)
Cambridge   1      5546    0.6   8341      1     58     140        82
Cambridge   2      7153    1.1   5970      2     58     140        82  
Cambridge   3      5621    2.3   5289      3     58     140        82
Cambridge   4      10403   4.3   4361      4     58     140        82
Cambridge   5      14796   4.2   3495      5     58     140        82  
...

我不得不缩短标题,所以让我更详细地解释一下:

  • 名称 - 地方当局名称
  • pcd.sector - 邮政编码扇区(所以是低级单位)
  • pop - 邮政编码部门的人口
  • area - 邮政编码扇区的表面积,以 km2 为单位
  • pop.dens - 是邮政编码部门的人口密度,以每平方公里的人数为单位
  • rank - 基于每个地方当局内人口密度的邮政编码部门排名
  • LA.4G - 地方当局的 4G 覆盖率百分比
  • LA.area - 每个地方当局区域列的总和
  • LA.4G(km2) - 每个地方当局内具有 4G 覆盖范围的 km2 数量

以剑桥为例,整个地方当局的 4G 覆盖率为 58%。然后我想分解这个数字以实现各个邮政编码部门的 4G 覆盖。

理想情况下,数据最终会如下所示,并为邮政编码部门覆盖范围增加一列:

Name      pcd.sect  ...     pcd.sector.coverage (%)
Cambridge   1       ...         100
Cambridge   2       ...         100
Cambridge   3       ...         100
Cambridge   4       ...         34
Cambridge   5       ...         0
...        ...      ...         ... 

如何让 R 根据区域列将这 82 平方公里(58% 的地理覆盖率)分配给新列中的邮政编码扇区,但一旦达到最大覆盖率 82 平方公里(58% 的地理覆盖率)就停止覆盖)?

【问题讨论】:

  • 为什么扇区 4 和 5 不是 100%?他们都有 82 平方公里。
  • LA.4G、LA.area 和 LA.4G(km2) 都是地方级的,为了简单起见,我只是把它们放在每一行。这里使用的数字是说明性的,但结构是正确的。
  • 请编辑您的答案并包括pcd.sector.coverage 的计算。我想不通,但您的问题可以使用ifelse() 语句解决。
  • 嗨,Jimbou,我现在已经编辑了答案,以便更清楚哪些数据适用于低级和高级单元。感谢关于“ifelse()”的建议

标签: r ranking area


【解决方案1】:

这就是我对这个问题的解释。如果这不是你的意思,请纠正我。 假设您有以下数据。

dat <- data.frame(
  Name = "A", pcd.sector = 1:5,
  area = c(2, 3, 1, 5, 3), 
  areaSum = 14, LA.4G = 8
)
dat

#  Name pcd.sector area areaSum LA.4G
#1    A          1    2      14     8
#2    A          2    3      14     8
#3    A          3    1      14     8
#4    A          4    5      14     8
#5    A          5    3      14     8

您有五个部门,各个领域。虽然这些区域加起来有14个,但4G覆盖的只有8个。您想从扇区 1 到 5 分配区域。

以下代码完成了这项工作。我使用cumsum 函数来计算顶部扇区的区域的累积总和,该区域受 4G 覆盖限制的限制。分配区域可以通过diff函数计算,该函数采用向量的一步差。扇区 1 到 3 得到 100% 的覆盖,总共有 6 个区域,因此只剩下 2 个。扇区 4 虽然有 5 个区域,但只能享受 2 个,即 40%。这会用完这些区域,并且没有任何东西留给扇区 5。

dat$area_allocated <- diff(c(0, pmin(cumsum(dat$area), dat$LA.4G)))
dat$area_coverage  <- dat$area_allocated / dat$area * 100
dat

#   Name pcd.sector area areaSum LA.4G area_allocated area_coverage
# 1    A          1    2      14     8              2           100
# 2    A          2    3      14     8              3           100
# 3    A          3    1      14     8              1           100
# 4    A          4    5      14     8              2            40
# 5    A          5    3      14     8              0             0

如果你有很多区域,那么你可能想使用dplyr::group_by函数。

dat <- rbind(
  data.frame(
    Name = "A", pcd.sector = 1:5,
    area = c(2, 3, 1, 5, 3), 
    areaSum = 14, LA.4G = 8
  ),
  data.frame(
    Name = "B", pcd.sector = 1:3,
    area = c(4, 3, 2), 
    areaSum = 9, LA.4G = 5
  )
)

library(dplyr)
dat <- dat %>% group_by(Name) %>% 
  mutate(area_allocated = diff(c(0, pmin(cumsum(area), LA.4G)))) %>%
  mutate(area_coverage = area_allocated / area * 100)
dat

#     Name pcd.sector  area areaSum LA.4G area_allocated area_coverage
#   <fctr>      <int> <dbl>   <dbl> <dbl>          <dbl>         <dbl>
# 1      A          1     2      14     8              2     100.00000
# 2      A          2     3      14     8              3     100.00000
# 3      A          3     1      14     8              1     100.00000
# 4      A          4     5      14     8              2      40.00000
# 5      A          5     3      14     8              0       0.00000
# 6      B          1     4       9     5              4     100.00000
# 7      B          2     3       9     5              1      33.33333
# 8      B          3     2       9     5              0       0.00000

【讨论】:

  • 这对 Kota Mori 有效,但我想首先将覆盖范围分配给人口密度最高的地区。你能帮我考虑一下问题中列出的排名变量吗?
  • 在我根据排名变量对数据进行排序后,后跟 LA 名称,我得到了这个工作。谢谢,这正是我需要的!
猜你喜欢
  • 2019-09-25
  • 2023-04-06
  • 2013-05-25
  • 2018-10-05
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多