2017-05-04 2 views
1

Ich habe zwei Eingabedatenrahmen, der erste heißt "Firms_Ind" und enthält 2 Spalten ("Firms", "Industry") mit mehreren Zeilen. Es gibt die Branchen-ID für jede Firma. Der andere heißt "ann_returns" und hat so viele Spalten wie "Firms_Ind" Zeilen und mehrere Zeilen hat. Es enthält die Rendite für jede der Firmen (Spalten) pro Jahr (Zeilen).Summenspalten zeilenweise basierend auf IDs in einem anderen Vektor

Ich möchte die jährliche mittlere Rendite pro Branche berechnen. Ich möchte also eine Ausgabematrix, die folgende Dimensionen hat: Anzahl der Spalten = Anzahl der Jahre und Anzahl der Zeilen = Anzahl der Jahre. Für jede Branche (Spalte) sollte die mittlere Rendite pro Jahr berechnet werden.

hier ist ein kleines Beispiel:

> Firms_Ind 
    Firms Industry 
1  A  1 
2  B  2 
3  C  3 
4  D  1 
5  E  2 
6  F  1 

> ann_returns 
     A B C D E F 
y1 0.20 0.11 0.13 0.30 0.24 0.03 
y2 0.23 0.08 0.03 0.23 0.17 0.01 
y3 0.28 0.19 0.11 0.21 0.19 0.07 

> Industry_mean 
      1 2 3 
y1_means 0.20 0.11 0.13 
y2_means 0.23 0.08 0.03 
y3_means 0.28 0.19 0.11 
+0

Haben Sie versucht, Umformen 'ann_returns' in Langform, dann verschmelzen' Firms_Ind' es, dann die Gruppe von der Industrie den Mittelwert zu berechnen? – coffeinjunky

Antwort

1

Hier ist eine Methode, mit sapply

# get a list of firms by industry 
inds <- split(Firms_Ind$Firms, Firms_Ind$Industry) 
# loop through industries to calculate annual means 
myMat <- sapply(inds, 
       function(i) if(length(i) > 1) rowMeans(ann_returns[, i]) else ann_returns[, i]) 

, hier sapply Schleifen durch die Industrie. Prüfen Sie für jede Branche, ob es mehr als eine Firma gibt, wenn ja, wenden Sie rowMeans an, wenn nein, geben Sie den ursprünglichen Wert zurück.

Das gibt

myMat 
      1  2 3 
y1 0.1766667 0.175 0.13 
y2 0.1566667 0.125 0.03 
y3 0.1866667 0.190 0.11 

Daten

Firms_Ind <- 
structure(list(Firms = structure(1:6, .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), Industry = c(1L, 2L, 3L, 1L, 
2L, 1L)), .Names = c("Firms", "Industry"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6")) 

ann_returns <- 
structure(c(0.2, 0.23, 0.28, 0.11, 0.08, 0.19, 0.13, 0.03, 0.11, 
0.3, 0.23, 0.21, 0.24, 0.17, 0.19, 0.03, 0.01, 0.07), .Dim = c(3L, 
6L), .Dimnames = list(c("y1", "y2", "y3"), c("A", "B", "C", "D", 
"E", "F"))) 
+0

Danke dafür! Dies scheint die Lösung zu sein, nach der ich suche. Wenn ich es jedoch mit meinen tatsächlichen Datenrahmen ausführe, tritt der folgende Fehler auf: Fehler in '[.data.frame' (ROE_ac,,,): nicht definierte Spalten ausgewählt Meine Datenframes: ann_returns ist ROE_ac (R = 305, C = 2) und Firmen_Ind ist Firmen_FF (R = 30, C = 305) – Tobi1990

1

Mit dplyr und tidyr

library(tidyr) 
library(dplyr) 

Industry_mean <- ann_returns %>% 
     gather(key=Firms,value=value,-Year) %>% #convert to long format 
     left_join(Firms_Ind) %>% #merge with firms_ind 
     group_by(Year,Industry) %>% #group as required 
     summarise(mean=mean(value)) %>% #calculate means 
     spread(key=Industry,value=mean) #convert back to wide format 

Industry_mean 

    Year  `1` `2` `3` 
* <chr>  <dbl> <dbl> <dbl> 
1 y1 0.1766667 0.175 0.13 
2 y2 0.1566667 0.125 0.03 
3 y3 0.1866667 0.190 0.11 
1

Wir können die ann_returns durch Spalte geteilt und dann laufen rowMeans:

# if Firms in correct order 
inds <- split.default(ann_returns, f = Firms_Ind$Industry) 

# # if Firms not in correct order: 
# inds <- split.default(
#  ann_returns, 
#  f = Firms_Ind$Industry[match(colnames(ann_returns), Firms_Ind$Firms)]) 

do.call(cbind, lapply(inds,rowMeans)) 
#   1  2 3 
# y1 0.1766667 0.175 0.13 
# y2 0.1566667 0.125 0.03 
# y3 0.1866667 0.190 0.11 

Die beiden Eingangs data.frames sind:

# > dput(ann_returns) 
structure(list(A = c(0.2, 0.23, 0.28), B = c(0.11, 0.08, 0.19 
), C = c(0.13, 0.03, 0.11), D = c(0.3, 0.23, 0.21), E = c(0.24, 
0.17, 0.19), F = c(0.03, 0.01, 0.07)), .Names = c("A", "B", "C", 
"D", "E", "F"), row.names = c("y1", "y2", "y3"), class = "data.frame") 
# > dput(Firms_Ind) 
structure(list(Firms = structure(1:6, .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), Industry = c(1L, 2L, 3L, 1L, 
2L, 1L)), .Names = c("Firms", "Industry"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6")) 
+0

danke! was genau meinst du, wenn Firmen in der richtigen Reihenfolge sind? – Tobi1990

+0

@ Tobi1990, ich meine, ob die Spaltennamen von 'ann_returns' in der gleichen Reihenfolge mit der Firm-Spalte von 'Firms_Ind' sind, so dass Sie direkt ohne übereinstimmende Firm-Namen zuerst teilen können. – mt1022

+0

ja ist es. Nochmals vielen Dank, Ihre Lösungen funktionieren perfekt! – Tobi1990

Verwandte Themen