2016-09-30 9 views
0

私は、地方自治体がカバーする地理的エリア(約200エリア)のパーセンテージとして、英国の地方自治体レベルで4Gモバイルカバレッジを持っています。私は約9000の下位レベルの郵便番号セクターで作業できるように、このデータを解体したいと思います。R - 順位設定に基づいてカバレッジエリアデータを分解する

私がこれを行う最も適切な方法は、モバイルオペレータが市場に投資する方法を最もよく表しているように、最も密集した人口の多い地域に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 
... 

ので、私はちょうどより多く、それらを詳細に説明しましょう::)3つの右の列を追加

  • 名前 - 地方自治体名
  • pcd.sector - 郵便番号セクタ(SO低レベルユニット)
  • ポップ - 平方キロメートル
  • ポップにおけるポストコードのセクタの表面積 - 郵便番号のセクタ
  • 地域の人口.dens - れる平方キロメートル
  • ランクごとに人に郵便番号のセクタの人口密度 - 各自治体内の人口密度に基づいて、郵便番号、セクタのランクは
  • LA.4G - 4G
  • と地方自治体の%カバレッジ
  • LA.area - 各地方自治体のエリア列の合計
  • LA.4G(KM2) - 各自治体内4GカバレッジとKM2の数

が、仮想的な例として、ケンブリッジをとります地方自治体全体で58%の4Gカバレッジです。私はその後、個々の郵便番号セクターの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%地理的範囲)を割り当ててもらうにはどうすればよいですセクターを新しい列に追加しますが、82km2(58%の地理的カバレッジ)の最大カバレッジ・レベルに達すると停止しますか?

+0

なぜセクタ4と5が100%でないのですか?彼らは82km2の両方を持っています。 – Jimbou

+0

LA.4G、LA.area、LA.4G(km2)はすべて地方自治体レベルであり、わかりやすくするために各行に置いてあります。ここで使用されている数字は例示的なものですが、構造は正しいです。 –

+0

答えを編集し、 'pcd.sector.coverage'の計算を含めてください。私はそれを理解することはできませんが、あなたの問題は 'ifelse()'ステートメントを使って解決することができます。 – Jimbou

答えて

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 

さまざまな分野の5つのセクタがあります。エリアの合計は14ですが、4Gでカバーされるのは8つだけです。セクタ1から5の領域を割り当てたいとします。

次のコードはこのジョブを行います。私はcumsum関数を使用して、トップセクターからの領域の累積合計を計算しました。これは、4Gのカバレッジ制限で制限されています。割り当て領域はdiff関数で計算することができます。これはベクトルの1ステップの差分をとります。セクター1から3までは100%のカバレッジを獲得し、合計で6つのエリアが得られます。したがって、2つだけが残ります。セクター4には5つの領域がありますが、2または40%しか楽しめません。これは、領域を使用し、何もあなたが領域の多くを持っている場合は、あなたがdplyr::group_by機能を使用することをお勧めします。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 

部門のために残されていません。

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 
+0

森浩太さんが働いていますが、最初に人口密度の高い地域にカバレッジを配分したいと思います。質問に記載されているランク変数を考慮に入れてください。 –

+0

ランク変数とLA名に基づいてデータをソートした後、私はこれを動作させました。ありがとう、それは私が必要としたものです! –

関連する問題