Как векторизировать: установите значение на основе в прошлый раз бинарный вектор был 1
Вопрос
У меня есть еще один вопрос для начинающих ...
Как я могу векторизировать (избегать для цикла) следующего кода:
# 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