2016-09-26 54 views
2

我有一年的數據框(2006年至2010年),4個行業部門,150個公司名稱和這些公司的淨收入。總共有750個觀察值,每個企業每年有一個觀察值。我想根據五分制在每個行業年度內爲企業的收入分數。因此,每個行業年度收入在前20%的公司得分爲5分,接下來的20%得分爲4分,依此類推。底部20%的分數爲1R計算基於分位數的分數

樣本數據的基礎是:

Year Industry Firm Income 
2006 Chemicals ABC 334.50 
2007 Chemicals ABC 388.98 
. 
. 
2006 Pharma XYZ 91.45 
. 
. 

如何R中做到這一點?我試過aggregatetapply以及quantile,但我無法得出應該用於此的邏輯。請幫忙。

我試過這只是爲了給最低的20%分配1的分數,但是它返回了一個錯誤。

db10$score <- ifelse(db10$income < aggregate(income~Year+industry,db10,quantile,c(0.2)),1,0) 
+0

你能提供一個你的數據集的例子嗎? – desc

+0

發表了一個典型的數據集示例 –

回答

1

試試這個方法:

首先,我將創建樣品哪裏來測試下面的功能:

y = c(rep(2001,15),rep(2002,15),rep(2003,15)) 
ind = c("A","B","C","D","E","G","H","I","J","K","L","M","N","O","P") 
val = runif(45,10,100) 
df = data.frame(y,ind,val) 

head(df,20) 

     y ind  val 
1 2001 A 63.32011 
2 2001 B 85.67976 
3 2001 C 86.77527 
4 2001 D 32.18319 
5 2001 E 49.86626 
6 2001 G 57.73214 
7 2001 H 18.08216 
8 2001 I 22.31012 
9 2001 J 44.11174 
10 2001 K 54.76902 
11 2001 L 41.82495 
12 2001 M 64.84514 
13 2001 N 59.16529 
14 2001 O 61.28870 
15 2001 P 84.76561 
16 2002 A 83.68185 
17 2002 B 45.01354 
18 2002 C 62.22964 
19 2002 D 98.41717 
20 2002 E 19.91548 

有3年了,從A產業的P.數據幀是按年份排序的,後來是按行業排列的。

下面這個函數需要一年價值y並計算五分類別所有df$val在一年df$yy

quintile = function(y) { 
    x = df$val[df$y == y] 
    qn = quantile(x, probs = (0:5)/5) 
    result = as.numeric(cut(x, qn, include.lowest = T)) 
} 

的唯一剩下的就是這個功能適用於特殊的一年值

df$qn = unlist(lapply(unique(df$y), quintile)) 

結果:

> head(df,20) 
     y ind  val qn 
1 2001 A 63.32011 4 
2 2001 B 85.67976 5 
3 2001 C 86.77527 5 
4 2001 D 32.18319 1 
5 2001 E 49.86626 2 
6 2001 G 57.73214 3 
7 2001 H 18.08216 1 
8 2001 I 22.31012 1 
9 2001 J 44.11174 2 
10 2001 K 54.76902 3 
11 2001 L 41.82495 2 
12 2001 M 64.84514 4 
13 2001 N 59.16529 3 
14 2001 O 61.28870 4 
15 2001 P 84.76561 5 
16 2002 A 83.68185 4 
17 2002 B 45.01354 1 
18 2002 C 62.22964 3 
19 2002 D 98.41717 5 
20 2002 E 19.91548 1 

也許有一個更簡單的實現這種方式...

分組由兩列

如果您想根據兩列的分組來計算五分位數:ygrp

y = c(rep(2001,15),rep(2002,15),rep(2003,15)) 
grp = c("G1","G1","G1","G1","G1","G2","G2","G2","G2","G2","G3","G3","G3","G3","G3") 
ind = c("A","B","C","D","E","G","H","I","J","K","L","M","N","O","P") 
val = round(runif(45,10,100)) 
df = data.frame(y,grp,ind,val) 

> head(df,20) 
     y grp ind val 
1 2001 G1 A 40 
2 2001 G1 B 33 
3 2001 G1 C 65 
4 2001 G1 D 99 
5 2001 G1 E 18 
6 2001 G2 G 36 
7 2001 G2 H 15 
8 2001 G2 I 17 
9 2001 G2 J 42 
10 2001 G2 K 67 
11 2001 G3 L 60 
12 2001 G3 M 34 
13 2001 G3 N 61 
14 2001 G3 O 76 
15 2001 G3 P 15 
16 2002 G1 A 18 
17 2002 G1 B 15 
18 2002 G1 C 44 
19 2002 G1 D 79 
20 2002 G1 E 22 

然後使用:

quintile = function(z) { 
    x = df$val[df$y == z[1] & df$grp == z[2]] 
    qn = quantile(x, probs = (0:5)/5) 
    result = as.numeric(cut(x, qn, include.lowest = T)) 
} 


df$qn = as.vector(apply(unique(df[,c("y","grp")]),1, quintile)) 

結果:

> head(df,20) 
     y grp ind val qn 
1 2001 G1 A 40 3 
2 2001 G1 B 33 2 
3 2001 G1 C 65 4 
4 2001 G1 D 99 5 
5 2001 G1 E 18 1 
6 2001 G2 G 36 3 
7 2001 G2 H 15 1 
8 2001 G2 I 17 2 
9 2001 G2 J 42 4 
10 2001 G2 K 67 5 
11 2001 G3 L 60 3 
12 2001 G3 M 34 2 
13 2001 G3 N 61 4 
14 2001 G3 O 76 5 
15 2001 G3 P 15 1 
16 2002 G1 A 18 2 
17 2002 G1 B 15 1 
18 2002 G1 C 44 4 
19 2002 G1 D 79 5 
20 2002 G1 E 22 3 

我這個例子中,y將是一年grp產業集團,ind的企業和val收入。

請注意apply中的c("y","grp")以及五分位函數內的列名的順序。你必須用你想要的列名替換它們。

請注意,如果您的團體規模較小(本例中爲每個團體5家企業),五分位可能不是唯一的,並且會彈出錯誤消息。從問題

quintile = function(z) { 
    x = df$Income[df$Year == z[1] & df$Industry == z[2]] 
    qn = quantile(x, probs = (0:5)/5) 
    result = as.numeric(cut(x, qn, include.lowest = T)) 
} 


df$qn = as.vector(apply(unique(df[,c("Year","Industry")]),1, quintile)) 

使用列名申請在此之前,該數據幀df必須按年份和行業進行排序。

+0

@RSchifini非常感謝,代碼適用於您的值。但。對不起,我想我沒有說清楚。我希望在每個行業年度內應用五分制分數。一年(比如說2001年),行業A可能有很多公司(A1,A2,A3 ......)。評分需要在這些公司內(A1,A2,A3 ......)每年進行。 –

+0

@PiyushShah,更新了答案。 –

+0

@Rschifini我收到一個錯誤,提示'$ <。。data.frame'錯誤('* tmp *',「qn」,value = list('1' = c(3,5,5:: )有30行,數據有2398'我有5年的數據和6個組,這就是爲什麼30.我根據你的代碼重新命名了我的變量並運行它 –