Как векторизировать: установите значение на основе в прошлый раз бинарный вектор был 1

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

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть еще один вопрос для начинающих ...

Как я могу векторизировать (избегать для цикла) следующего кода:

# 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
    }
}

Я застрял в том, чтобы думать, что SAS Data Step Way и Desperatley в поисках удержания и т. Д. Где я могу найти простые обзорвы, чтобы понять саппай и т. Д.

Спасибо за любую помощь.

Лучший, Само.

Это было полезно?

Решение

Если я правильно понял, ваша проблема: у вас есть два вектора signal а также mktdataclose длины n, и вы хотите создать новый вектор EntryPrices длины n так что mktdataclose[i] это ценность mktdataclose а последний время signal был 1 в или раньше i. Анкет Вы можете сделать это без петли, используя cummax, часто неожиданно полезная функция (обратите внимание, что этот вопрос похож по вкусу с некоторыми из ваших предыдущих вопросов, которые были также решены с использованием этой функции и cumsum) Вот и мы, используя данные Гэвина:

set.seed(123)
signal <- sample(0:1, 10, replace = TRUE)
mktdataclose <- runif(10, 1, 10)  

Наша проблема в том, чтобы преобразовать signal вектор в вектор соответствующих индексов:

indices <- cummax( seq_along(signal) * signal)

Это именно indices Мы хотим, за исключением 0. Теперь мы установили EntryPrices Извлекая значения в ненулевом indices из 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

Другие советы

Поскольку сигнал равен 0 и 1, я предполагаю, что вы можете векторизировать:

EntryPrices * signal

Вот еще одно решение, которое вы можете найти более прямым. Я использую Prasad's Pesudo-Data.

> 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top