2016-12-04 5 views
1

私は別のデータフレーム(DF2)を有するR:円の内側点を特定し、2つのデータフレーム

Town_From<-c("A","A","A","B","B","C") 
    Town_To<-c("B","C","D","C","D","D") 
    Distance<-c(10,5,18,17,20,21) 
    Df<-data.frame(Town_From,Town_To,Distance) 

Town_From Town_To Distance 
    A   B  10  
    A   C   5  
    A   D  18  
    B   C  17  
    B   D  20  
    C   D  21  

の下のようなサンプルデータセットを抱えているに基づいて新しい列を計算人口を有する

Town<-c("A","B","C","D") 
    Population<-c(1000,800,500,200) 
    Df2<-data.frame(Town,Population) 

    Town Population 
    A  1000 
    B  800 
    C  500 
    D  200 

何が必要なのは "Pop_within_Distance" として算出列は

Town_From Town_To Distance Pop_within_Distance 
    A   B  10  2300 
    A   C   5  1500 
    A   D  18  2500 
    B   C  17  1300 
    B   D  20  1500 
    C   D  21  700 

Town_Fromが私の原点復帰されていますおよびI「がPop_within_Distance」として「Town_From」および「Town_To」の半径内にある都市の人口の合計を計算する必要が

例えば、1行目で

、「Pop_within_Distance」= Pop_A + Pop_B + Pop_C = 1000 + 800 + 500 = 2300(これは、町A、B &Cが町Aの半径10の円の中にあるからである)4番目の行「Pop_within_Distance」= Pop_B + Pop_C = 800 + 500 = 1300 (これは、町B &Cのみが町Bの半径17の円内にあるためです)

Rでこれをどのように計算できますか?

+0

これは本当にコーディングの問題ではありません。それは数学の問題です。 – ulfelder

+1

@ulfelderそれは素敵な宿題です。 OP:もしそうなら、あなたは何を試しても失敗しましたか? – hrbrmstr

答えて

0

あなたは私たちが最初に自分のデータフレームに変換することを考えるdplyrでこれを行うことができますのでTown_FromTown_To、およびTown列は、文字やない要因であること(またはそれらは同じレベルの要因である):

library(dplyr) 
Df <- Df %>% left_join(Df2,by=c("Town_To"="Town")) %>% 
      group_by(Town_From) %>% 
      arrange(Distance) %>% 
      mutate(Pop_within_Distance=cumsum(Population)+Df2$Population[Df2$Town %in% Town_From]) %>% 
      select(-Population) %>% arrange(Town_From,Town_To) 
##Source: local data frame [6 x 4] 
##Groups: Town_From [3] 
## 
## Town_From Town_To Distance Pop_within_Distance 
##  <chr> <chr> <dbl>    <dbl> 
##1   A  B  10    2300 
##2   A  C  5    1500 
##3   A  D  18    2500 
##4   B  C  17    1300 
##5   B  D  20    1500 
##6   C  D  21     700 

注意:これDf2DfTown_ToTownによって

  1. まずleft_join 2つのデータフレームTown_Fromによって

    Town_From Town_To Distance Population 
    1   A  B  10  800 
    2   A  C  5  500 
    3   A  D  18  200 
    4   B  C  17  500 
    5   B  D  20  200 
    6   C  D  21  200 
    
  2. グループとarrangeを使用してDistanceでテーブルをソート:私たちはこの中間結果を取得しています。ここでのポイントは、cumsumPopulationに使用して、距離が現在の行以下の町の合計の母集団を計算できることです。

  3. Df2の元町(すなわち、Town_From)の母集団をこの計算に加えて、mutateを使用してPop_within_Distance列を作成します。
  4. 最後に、Population列を削除し、元の行の順序を戻します。

データ:

Df <- structure(list(Town_From = c("A", "A", "A", "B", "B", "C"), Town_To = c("B", 
"C", "D", "C", "D", "D"), Distance = c(10, 5, 18, 17, 20, 21)), .Names = c("Town_From", 
"Town_To", "Distance"), row.names = c(NA, -6L), class = "data.frame") 
## Town_From Town_To Distance 
##1   A  B  10 
##2   A  C  5 
##3   A  D  18 
##4   B  C  17 
##5   B  D  20 
##6   C  D  21 

Df2 <- structure(list(Town = c("A", "B", "C", "D"), Population = c(1000, 
800, 500, 200)), .Names = c("Town", "Population"), row.names = c(NA, 
-4L), class = "data.frame") 
## Town Population 
##1 A  1000 
##2 B  800 
##3 C  500 
##4 D  200 
+0

説明的な回答ありがとうございました。私はソートと累積合計を得ることについて考えなかった。むしろ、距離のある円の内側の点を特定する方法を考えていました。これはシンプルで非常に有用な解決策でした。 – Jessie

関連する問題