2016-09-26 3 views
2

Ich habe einen Datenrahmen mit Jahr (2006 bis 2010), 4 Branchen, 150 Firmennamen und das Nettoergebnis dieser Unternehmen. Insgesamt habe ich 750 Beobachtungen, eine für jedes Unternehmen für jedes Jahr. Ich möchte den Unternehmen auf der Grundlage der Quintiles Punkte für ihr Einkommen in jedem Industriejahr geben. So erhalten Firmen mit Einkommen in den Top 20% innerhalb jedes Industriejahrs eine Punktzahl von 5, die nächsten 20% erhalten eine Punktzahl von 4 und so weiter. Die unteren 20% einen Wert von 1.Berechnung Quintil basierend Werte auf R

Die Probe Datenbank ist erhalten:

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

Wie kann ich dies tun in R? Ich habe versucht, aggregate und tapply zusammen mit quantile aber bin nicht in der Lage an der Logik zu kommen, die dafür verwendet werden soll. Bitte helfen Sie.

ich versuchte, das nur einen Wert von 1 bis 20% der niedrigsten zuzuteilen, aber es ein Fehler zurückgegeben.

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

Können Sie ein Beispiel für Ihren Datensatz angeben? – desc

+0

Posted ein typisches Beispiel für den Datensatz –

Antwort

1

Versuchen Sie diese Methode:

Zuerst werde ich die Probe schaffen, in der die Funktion unten testen:

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 

Es gibt 3 Jahre und Branchen von A bis P. Die Datenrahmen wird nach Jahren sortiert und später von der Industrie.

Diese Funktion nimmt unter einen Jahreswert y und berechnet die Quintil Kategorie für all df$val wo das Jahr 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)) 
} 

Das einzige, was links diese Funktion auf das einzigartige Jahr anzuwenden ist Wert

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

Ergebnis:

> 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 

Vielleicht gibt es eine viel einfachere Art und Weise dies ... von zwei Säulen

Gruppierung zu implementieren Wenn Sie auf die Gruppierung von zwei Spalten Quintiles berechnen möchten: y und grp

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 

Dann nutzen:

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)) 

Ergebnis:

> 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 

ich dieses Beispiel, y wäre das Jahr und grp die Industriegruppe, ind die Firmen und val das Einkommen.

Achten Sie auf die Reihenfolge c("y","grp") innerhalb der apply und die Spaltennamen innerhalb der Quintil-Funktion. Sie müssen sie durch die gewünschten Spaltennamen ersetzen.

Seien Sie gewarnt, wenn Ihre Gruppen klein sind (in diesem Beispiel 5 Firmen pro Gruppe), sind die Quintile möglicherweise nicht eindeutig und ein Fehler wird angezeigt.

Mit Spaltennamen Frage

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)) 

Vor diesem Anlegen der Datenrahmen df muss nach Jahr und Industrie bestellt werden.

+0

@RSchifini Vielen Dank, der Code funktioniert für Ihre Werte. Aber. Es tut mir leid, ich glaube, ich habe mich nicht klar ausgedrückt. Ich möchte, dass Quintil-Scores innerhalb jedes Industriejahres angewendet werden. Für ein Jahr (sagen wir 2001) könnte die Industrie A viele Firmen haben (A1, A2, A3 ...). Das Scoring muss innerhalb dieser Firmen (A1, A2, A3 ...) für jedes Jahr funktionieren. –

+0

@PiyushShah, aktualisiert die Antwort. –

+0

@Rschifini Ich erhalte einen Fehler, der sagt 'Fehler in' $ <-. Data.frame' ('* tmp *', "qn", Wert = Liste ('1' = c (3, 5, 5,: Ersetzung hat 30 Reihen, Daten hat 2398' Ich habe 5 Jahre Daten und 6 Gruppen und deshalb die 30. Ich benannte meine Variablen gemäß Ihrem Code um und lief es. –

Verwandte Themen