@connor74

Как сделать перебор значений в таблице без for?

Сломал голову в попытке решить вопрос, очень прошу помощи.

Имеется таблица data:
date
type
price
exp.price

Также имеется вектор:
a <- c(65000, 55000, 45000, 80000, ...)

Необходимо прогнать каждое значение вектора a, совершая некие действия с полями таблицы data (price, exp.price), формируя новый вектор, который состоит из суммы значений результатов действий с параметроми таблицы по каждому значению вектора a.

Понимаю, что нужно использовать как то apply и прочие, но как - ума не приложу.
  • Вопрос задан
  • 257 просмотров
Пригласить эксперта
Ответы на вопрос 4
@khrisanfov
Программист
Такой вариант не подходит?

data$new_price <- data$price + a
Ответ написан
@kgbplus
fun <- function(num){здесь функция, которая берет число num и делает что то с data}
result <- mapply(fun,a)


Это называется векторизация функции
Ответ написан
Комментировать
@connor74 Автор вопроса
Всё равно не доходит, попробую более чётко пояснить, что требуется, ибо по тому, что написал и правда не понятно.

есть таблица опционов:

opt.type oper strike price.open
CALL buy 66000 800
CALL buy 66000 700
PUT sell 65000 750
...

есть вектор цены базового актива:
underline <- seq(40000, 80000, by=500)

необходимо на каждое значение в векторе базового актива провести расчёт прибыли/убытка по каждой строке, вот алгоритм вычисления по одной строке, с одним значением базового актива

underline <- seq(40000, 80000, by=500)

if(oper.type == 'BUY' & option.type == 'CALL' & underline <= strike) {
    return(-price.open)
  }
  else if(oper.type == 'BUY' & option.type == 'CALL' & underline > strike) {
    return(underline - strike - price.open)
  }
  else if(oper.type == 'BUY' & option.type == 'PUT' & underline <= strike) {
    return(strike - underline - price.open)
  } 
  else if(oper.type == 'BUY' & option.type == 'PUT' & underline > strike) {
    return(-price.open)
  } 
  
  if(oper.type == 'SELL' & option.type == 'CALL' & underline <= strike) {
    return(price.open)
  }
  else if(oper.type == 'SELL' & option.type == 'CALL' & underline > strike) {
    return(-(underline - strike - price.open))
  }
  else if(oper.type == 'SELL' & option.type == 'PUT' & underline <= strike) {
    return(-(strike - underline - price.open))
  } 
  else if(oper.type == 'SELL' & option.type == 'PUT' & underline > strike) {
    return(price.open)
  }


Далее необходимо суммировать фин. рез. по всем строкам по одной цене базового актива, записать значение в новый вектор и перейти к другому значение базового актива в векторе, и так прогнать все значения вектора к таблице. В итоге, нужно получить вектор размером как и вектор underline.

Прошу прощение за сумбур, но мне кажется сейчас подробнее изложил.
Ответ написан
Комментировать
@John_Alban
Network/IDS engineer
Оформите торговое правило в функцию. Далее эту функцию просто натравите на данные через
apply(data, 1, function(x) {
fun_name(options_data[x, ])
})

Или так
foreach(i=nrow(options_data), .combine=rbind) %do% {
fun_name(options_data[i, ]) %>% as.data.frame(.)
}

И еще - перепишите торговое правило через ifelse() функции (вместо базовых if {} else {} конструкций)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы