2016-12-04 68 views
1

我有一個樣本數據集像下面R:識別點的圓內和基於兩個dataframes

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  

我有另一個數據幀(DF2)計算一個新的列,其具有羣體值

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是我的原稿在我需要計算的位於「Town_From」和「Town_To」爲「Pop_within_Distance」

例如半徑內的城鎮居民的總和,

在第一行,「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_ToTown列字符,而不是要素(或它們與同級別的因素):

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 

注:

  1. 首先left_join兩個數據通過Town_ToDf幀和在Df2所以Town我們得到這個中間結果:

    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. 集團通過Town_From和使用arrangeDistance表進行排序。這裏的要點是,我們現在可以使用cumsum,Population來計算距離小於或等於當前行的城鎮的總人口。

  3. 然後使用mutate創建Pop_within_Distance列,並將該計算添加來自Df2的原始城鎮(即Town_From)人口。
  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