在R中组合不同细节级别的聚合

时间:2017-03-24 06:49:43

标签: 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 Washington = 1 /(abs(2 / 4-6 / 10)+ abs(2 / 4-4 / 10))= 5
  • RDI Boston = 1 /(abs(4 / 6-6 / 10)+ abs(2 / 6-4 / 10))= 7.5

当然,这是模拟数据,我有100多个城市和行业。我无法在R中做到这一点,即使是在多个步骤中,没有将df按城市分割然后重新组装,这看起来非常笨重。

2 个答案:

答案 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

答案 1 :(得分: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