So vektorisieren Sie: Legen Sie einen Wert auf der Grundlage des letzten Mals ein Binärvektor fest. 1 war 1
Frage
Ich habe eine andere Frage an Anfänger ...
Wie kann ich den folgenden Code vectorisieren (vermeiden):
# algorithm for getting entry prices (when signal > 0): look back from current
# position until you find first signal > 0,
# `mktdataclose` at that time is entry price
# `entryPrices` is an xts object representing entry prices
# if entryPrices are not available (is.null == TRUE) then wee need to reconstruct
# them from signal (xts object with 1 when entry signal triggered and 0
# otherwise) and close prices available in mktdataclose (an xts object with the
# same length as signal and same dates just that it represents closing prices)
EntryPrices <- entryPrices
if (is.null(EntryPrices)) {
# get entryprices as close prices on buy signal
EntryPrices <- ifelse(signal > 0, mktdataclose, 0)
entryPrice <- 0
for (i in 1:NROW(signal)) {
if (signal[i] > 0) entryPrice <- mktdataclose[i]
EntryPrices[i] <- entryPrice
}
}
Ich bin festgefahren, wenn ich den SAS -Datenschritt und Desperatley für Rückhaltung usw. denke. Wo kann ich einige einfache Exapel finden, um Sapply usw. zu verstehen (R -Hilfe über? Sapply ist leider für mich kompliziert ... :()
Danke für deine freundliche Hilfe.
Am besten, Samo.
Lösung
Wenn ich richtig verstanden habe, ist Ihr Problem: Sie haben zwei Vektoren signal
und mktdataclose
von Länge n
, und Sie möchten einen neuen Vektor erstellen EntryPrices
von Länge n
so dass mktdataclose[i]
ist der Wert von mktdataclose
das letzte Zeit signal
war 1 zum oder vor der Zeit i
. Sie können dies ohne eine für Schleife tun, verwenden Sie cummax
, eine oft unerwartet nützliche Funktion (Beachten Sie, dass diese Frage in einigen Ihrer früheren Fragen ähnlich ist, die mit dieser Funktion und ähnlich gelöst wurden cumsum
). Hier gehen wir und verwenden Gavins Daten:
set.seed(123)
signal <- sample(0:1, 10, replace = TRUE)
mktdataclose <- runif(10, 1, 10)
Unser Problem ist es wirklich, das zu konvertieren signal
Vektor in einen Vektor der entsprechenden Indizes:
indices <- cummax( seq_along(signal) * signal)
Das ist genau das indices
Wir wollen, bis auf die 0. Jetzt setzen wir EntryPrices
durch Extrahieren der Werte am ungleich Null indices
aus mktdataclose
:
EntryPrices <- c( rep(0, sum(indices==0)), mktdataclose[ indices ])
> cbind(signal, indices, mktdataclose, EntryPrices)
signal indices mktdataclose EntryPrices
[1,] 0 0 9.611500 0.000000
[2,] 1 2 5.080007 5.080007
[3,] 0 2 7.098136 5.080007
[4,] 1 4 6.153701 6.153701
[5,] 1 5 1.926322 1.926322
[6,] 0 5 9.098425 1.926322
[7,] 1 7 3.214790 3.214790
[8,] 1 8 1.378536 1.378536
[9,] 1 9 3.951286 3.951286
[10,] 0 9 9.590533 3.951286
Andere Tipps
Da das Signal 0 und 1 ist, nehme ich an, Sie können mit:
EntryPrices * signal
Hier ist eine andere Lösung, die Sie möglicherweise einfacher finden. Ich benutze Prasads Psudo-Daten.
> EntryPrices <- ifelse(signal > 0, mktdataclose, NA)
> EntryPrices <- na.locf(EntryPrices, na.rm=FALSE)
> cbind(signal,mktdataclose,EntryPrices)
signal mktdataclose EntryPrices
[1,] 0 9.611500 NA
[2,] 1 5.080007 5.080007
[3,] 0 7.098136 5.080007
[4,] 1 6.153701 6.153701
[5,] 1 1.926322 1.926322
[6,] 0 9.098425 1.926322
[7,] 1 3.214790 3.214790
[8,] 1 1.378536 1.378536
[9,] 1 3.951286 3.951286
[10,] 0 9.590533 3.951286