Да, все oop подойдет. Вот пример, созданный для более общего использования:
X <- data.frame(P = c(0.01, 0.3, 0.02, 0.015, 0.2), S0 = 1)
update <- function(x, p) x * (1-p)
fname <- "S0"
basename <- "S"
for (i in 1:5) {
newname <- paste0(basename, i)
X[[newname]] <- update(X[[fname]], X$P)
fname <- newname
}
Для проверки эффективности , я рассчитал это l oop для фрейма данных с 100 000 000 записей, созданных случайным образом через
X <- data.frame(P = rbeta(1e8, 2, 2), S0 = 1)
. Это заняло 1,58 секунды пользовательского времени и 1,78 секунды прошедшего времени. Если у вас нет гораздо большего фрейма данных или вам нужно сгенерировать гораздо больше столбцов, это выглядит достаточно эффективно.