Если я правильно понял, ваша проблема: у вас есть два вектора signal
и mktdataclose
длины n
, и вы хотите создать новый вектор EntryPrices
длины n
такой, что mktdataclose[i]
значение mktdataclose
последнее время signal
было 1 в или раньше времени i
. Вы можете сделать это без цикла for, используя 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