2016-09-26 7 views
2

私は年(2006年から2010年)、4つの業種、150社の会社名とこれらの会社の純所得とのデータフレームを持っています。合計で私は750の観測値を持っています。各観測値は毎年1つです。私は五分木に基づいて各業種年度の収入について企業にスコアを与えたいと思っています。したがって、各業種の中でトップ20%の所得を持つ企業は5点、次の20%は4点のスコアを取得します。下の20%が1のQ値を計算するR

サンプルデータベースのスコアを取得することです:

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

私はRでこれをどのように行うのですか?私はquantileと一緒にaggregatetapplyを試しましたが、これに使用すべきロジックに到達できません。助けてください。

最低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 

からP.ザ・への産業があり3年であり、データフレームは、年ごと、および業界別に注文されます。

以下この関数は、年の値yを取り、年df$yが残された唯一のものは独特の年の値

にこの機能を適用することです y

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$valための五分位のカテゴリを算出し、

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 
2列

によって

多分これを実現するためにはるかに簡単な方法がある...

グループが2つの列のグループ化に基づいて五分位数を計算したい場合: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 

Iこの例で、y年とgrp業界団体、ind企業とval収入になります。

applyの中のc("y","grp")の順番に注意し、5分音符の内部の列の名前に注意してください。必要な列名に置き換える必要があります。

グループが小さい場合(この例ではグループあたり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ありがとう、コードはあなたの価値のために働きます。しかし。申し訳ありませんが、私は自分自身を明確にしていないと思います。私は各業界で年間五分の一のスコアを適用したいと思っています。 1年(2001年)には、A産業には多くの企業(A1、A2、A3 ...)がいるかもしれません。スコアリングは、毎年これらの企業(A1、A2、A3 ...)内で動作する必要があります。 –

+0

@ PiyushShah、答えを更新しました。 –

+0

@Rschifini '$ < - 。data.frame'のエラー(' * tmp * '、" qn "、値=リスト(' 1' = c(3,5,5、: 30行あり、データは2398です。私は5年分のデータと6つのグループを持っています。その理由は30です。私は自分の変数ごとに変数を変更して実行しました。 –