2016-09-15 85 views
0

我有一個Excel工作表,其中包含美國每個縣的每個行業的就業編號。根據功能創建一個新列

它看起來像這樣:

County Industry Employees 
a  1   49 
a  2   1 
b  1   4 
b  2   19 
... 

我希望在每個縣,計算Herfindahl-Hirschman index(HHI)就業。我使用R. 鑑於一些數字,計算HHI很容易:

hhi <- function(x) { 
    # calculate sum 
    total <- sum(x) 

    # calculate share 
    share <- x*100/total 

    # add 
    return(sum(share^2)) 

} 

因此,舉例來說,縣1具有9608一個HHI(= 98^2 + 2^2),縣2具有HHI爲7127.

但是我怎樣才能創建一個新的列與該縣的HHI?

回答

4

您可以使用dplyr

library(dplyr) 
df %>% group_by(County) %>% mutate(HHI = sum((Employees/sum(Employees) * 100)^2)) 

# Source: local data frame [4 x 4] 
# Groups: County [2] 

# County Industry Employees  HHI 
# <fctr> <int>  <int> <dbl> 
# 1  a  1  50 9615.532 
# 2  a  2   1 9615.532 
# 3  b  1   4 7126.654 
# 4  b  2  19 7126.654 

或者等價地,使用data.table

setDT(df)[, HHI := sum((Employees/sum(Employees) * 100)^2), County][] 

有了自己的定製功能hhi,因爲它調用矢量的所有功能,你可以直接使用它與mutate

df %>% group_by(County) %>% mutate(HHI = hhi(Employees)) 

或:

setDT(df)[, HHI := hhi(Employees), County][] 
+0

如何忽略NA使用第一種方法值? – wwl

+1

您可以爲sum函數指定na.rm = T。 – Psidom

3

我們可以使用從base Rave(沒有使用包)

df1$HHI <- with(df1, ave(Employees, County, FUN = hhi))