For Loop

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Rlux

For Loop

Beitrag von Rlux »

Hi R Gemeinde,

Ich hätte ne Frage bezüglich for Loops in Zusammenhang mit einem Risiko Report. Ausgangslage sind returns von Apple und Microsoft über 20 Tage für die ich in erster Instanz simplifiziert den Mittelwert via Loop berechnen lassen will. Natürlich weiß ich, dass man es einfacher machen könnte (ohne Loop), aber es geht mir drum die Loops zu erlernen falls mal mehr Aktien und mehr als nur Mittelwert zu berechnen sind. Soviel zum Kontext.
Code ist wie folgt:

stock<-read.zoo("stock.csv",header=TRUE,sep=",",format="%Y-%m-%d") # CSV mit Preisen
return<-diff(log(stock))
AAPL<-return[,1]
MSFT<-return[,2]
data<-cbind(AAPL,MSFT)
ticker=stock
i=1
for(t in ticker){
mean=c(mean,mean(data[,i]))
i=i+1
}

Folgende Fehlermeldung taucht auf: Subscript out of bound.

Könnte mir jemand weiterhelfen?
LG,
David
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: For Loop

Beitrag von bigben »

Hallo!

Code: Alles auswählen

for(t in c(1,2,3,4))
würde funktionieren, weil t der Reihe nach jeden Wert dieses Vektors einnehmen kann. ticker hingegen ist eine Tabelle mit zwei Dimensionen, nicht ein eindimensionaler Vektor. Ich denke, dass darin das Problem liegt.

Noch ein Tipp: Nenne nie eine Variable nach einem keyword der Sprache. "return" wird für return-Statements der Art "return(42)" benötigt. R kann beides sauber auseinander halten, aber die Chancen auf völlig irreführende Fehlermeldungen im Falle eines Syntax-Fehlers sind hoch.

Ansonsten machst Du Dir wahrscheinlich zu viel Aufwand mit dem i. Versuch mal so was hier:

Code: Alles auswählen

for(i in 1:ncol(ticker)){
    mean <- c(mean, mean(data[,i]))
}
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: For Loop

Beitrag von jogo »

Hallo David,

willkommen im Forum. Was ist den stock für ein Objekt? Bitte zeig doch mal das Ergebnis von

Code: Alles auswählen

str(stock)
Wenn stock wirklich die geeignete Struktur hat, willst Du mit der for-Schleife folgendes ausrechenen:

Code: Alles auswählen

colMeans(data[, ticker])
(Lösung ohne for-Schleife :!: )

Noch eine Anmerkung: mean und return sind Namen von R-Funktionen, siehe:

Code: Alles auswählen

help("mean")
help("return")
Auch wenn R es zulässt, dass Du diese Namen für Deine eigenen Objekte verwendest, ist es keine gute Idee. (Und auch wenn man über den Programmiestil trefflich streiten kann: die Verwendung von Namen von bereits definierten Funktionen für eigene Objekte ist unstrittig schlechter Programmierstil.)

Wenn der Code, den Du gezeigt hast, alles ist, dann passiert beim ersten Durchlauf von

Code: Alles auswählen

mean=c(mean,mean(data[,i]))
folgendes:
es soll ein neues Objekt mit dem Namen mean angelegt werden, das wie folgt konstuiert wird:
kombiniere ( c() ) die in R vorhandene Funktion mean() mit dem Mittelwert der i-ten Spalte von data.

Bitte lies vor Deiner nächsten Nachricht, wie man Codestücke formatiert: viewtopic.php?f=20&t=29

Gruß, Jörg
Antworten