2017-03-24 31 views
1

我有就業的表由市和行業結合不同詳細程度的集合體中的R

df <- read.table(text="city industry emp 
Washington Auto 2 
Washington Aero 2 
Boston Auto 4 
Boston Aero 2", header = TRUE) 

我想通過城市來計算相對多樣性指數,即總和爲每個 城市,在所有行業中各行業在當地就業中所佔份額與其在國內就業中的份額之差的絕對值。數學如下所示:RDIc = 1 /Σi| Sci-Si | (小寫字母爲下標:c爲城市,i爲行業; RDI爲索引; S爲份額)。

使用上述數據,我應該得到:

city  rdi 
Washington 5 
Boston  7.5 

因爲:

  • RDI華盛頓= 1 /(ABS(2/4-6/10)+ ABS(2/4 -4/10))= 5
  • RDI波士頓= 1 /(ABS(4/6-6/10)+ ABS(2/6-4/10))= 7.5

當然,這是模擬數據,我有100多個城市和行業。我還沒有能夠在R中做到這一點,即使在多個步驟中,也沒有按城市劃分DF,然後重新組裝它,這看起來非常笨重。

回答

2

許多小步驟,但這個工程

library(dplyr) 
natl = df %>% 
    mutate(ind_total = sum(emp)) %>% 
    group_by(industry) %>% 
    summarize(si = sum(emp)/first(ind_total)) %>% 
    select(industry, si) 

result = df %>% 
    group_by(city) %>% 
    mutate(sci = emp/sum(emp)) %>% 
    inner_join(natl) %>% 
    group_by(city) %>% 
    summarize(rdi = 1/sum(abs(sci - si))) 

result 
# # A tibble: 2 × 2 
#   city rdi 
#  <fctr> <dbl> 
# 1  Boston 7.5 
# 2 Washington 5.0 
3

這個答案是基於@Gregor漂亮的答案。我剛纔想減少步驟,使您不必再創建一個data.frame然後加入它

df1 <- df %>% 
    mutate(ind_total = sum(emp)) %>% 
    group_by(industry) %>% 
    mutate(si = sum(emp)/first(ind_total)) %>% 
    group_by(city) %>% 
    mutate(sci = emp/sum(emp)) %>% 
    summarise(rdi = 1/sum(abs(sci - si))) 

> df1 
# A tibble: 2 × 2 
     city rdi 
     <fctr> <dbl> 
1  Boston 7.5 
2 Washington 5.0 
+0

洛爾 - 我向下滾動,以至於我只看到你的代碼的頂部,錯過了注,頂端。我覺得你已經複製了我的答案而感到惱火 - 向上滾動以查看你的評論,然後開懷大笑。 – Gregor

+1

:-) 感謝您的回答。我從中學到了很多東西。老實說,我不會認爲我是一個答案。我認爲更多的是作爲評論,但是當我把它寫成評論時,它的格式不是很好的答案。 – aelwan

+1

我想你可以忽略'ungroup',因爲無論如何你都會改變下一行的分組。 –