So vektorisieren Sie: Legen Sie einen Wert auf der Grundlage des letzten Mals ein Binärvektor fest. 1 war 1

StackOverflow https://stackoverflow.com/questions/5361878

  •  27-10-2019
  •  | 
  •  

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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top