2017-02-06 5 views
0

Ich fange gerade an, R für statistische Analyse zu verwenden, und ich lerne noch. Ich habe ein Problem mit dem Erstellen von Schleifen in R. Ich habe den folgenden Fall und ich fragte mich, ob mir jemand helfen kann. Für mich scheint es unmöglich, aber für einige von euch ist es nur ein Stück Kuchen. Ich habe einen Datensatz für verschiedene Firmen in verschiedenen Jahren. Für jedes Unternehmen habe ich tägliche Aktienkursdaten und ich muss die Aktienrendite für jedes Unternehmen für jeden Tag berechnen, wobei die folgende Gleichung verwendet wird: (Pt - Pt-1)/ Pt-1 wobei Pt der Aktienkurs des aktuellen Tages und Pt-1 der Aktienkurs des vorherigen Tages ist Tag. der Datensatz ich habe, ist wie folgt zusammen:Berechnung mit Schleife in R

Date  Firm Price 
1/1/2009 A  2  
2/1/2009 A  2.5 
3/1/2009 A  5 
4/1/2009 A  4 
1/1/2010 A  1.5 
2/1/2010 A  1.8 
3/1/2010 A  6 
4/1/2010 A  7 
1/1/2009 B  16  
2/1/2009 B  15 
3/1/2009 B  10 
4/1/2010 B  11 
1/1/2010 B  20 
2/1/2010 B  13 
3/1/2010 A  12 
4/1/2010 A  10 

das Ergebnis ich brauche, ist wie folgt

Date  Firm Price Return 
1/1/2009 A  2  NA 
2/1/2009 A  2.5 0.25 
3/1/2009 A  5  1 
4/1/2009 A  4  -0.2 
1/1/2010 A  1.5 -0.625 
2/1/2010 A  1.8 0.2 
3/1/2010 A  6  2.33333 
4/1/2010 A  7  0.166667 
1/1/2009 B  16  NA 
2/1/2009 B  15  -0.0625 
3/1/2009 B  10  -0.3333 
4/1/2010 B  11  0.1 
1/1/2010 B  20  0.81818 
2/1/2010 B  13  -0.35 
3/1/2010 A  12  -0.07692 
4/1/2010 A  10  -166667 

Ich hoffe, dass Sie mich mit diesem Problem helfen kann. Vielen Dank im Voraus.

+0

Verwandte - http://stackoverflow.com/questions/42049356/difference-between- zwei-Zeilen-geteilt durch die vorherige Zeile/42049872 # 42049872 – Sotos

Antwort

0

Ich denke, das sollte funktionieren (ich verwenden, um diese Calculating %changes with the By()):

# defining a function which calculates percent change 

myFun <- function(x){ 
n <- nrow(x) 
x$Change <- c(NA,diff(x$Price)/head(x$Price,n-1)) 
x 
} 

# applying it over the data frame by `Firm` type 

do.call(rbind,by(df,df$Firm,FUN=myFun)) 
+0

Danke @ stove7 für Ihre Hilfe. Der Code hat perfekt funktioniert. –

+0

Auch ich muss auf eine andere Antwort von @Sotos verweisen: https://StackOverflow.com/Questions/42049356/Difference-between-two-rows-divided-by-the-previous-row/42049872#42049872 –

2

Mit dplyr:

library(dplyr) 
df %>% 
    group_by(Firm) %>% 
    mutate(Return = (Price - lag(Price))/lag(Price)) 
+3

müssen Sie auch 'group_by (Firm)' – Sotos

+0

Danke, aktualisiert meine Antwort – GGamba

+0

@Sotos und @GGamba vielen Dank für Ihre Hilfe, aber ich habe eine Problem beim Installieren des Pakets 'dplyr'. Ich erhalte diese Nachricht von R: 'Warnung in install.packages: Paket 'dplyr' ist nicht verfügbar (für R Version 3.1.1)'. Ich weiß nicht, was zu tun ist –