Еще одна векторизованная опция, использующая data.table
, которая должна быть быстрее без прохождения строки за строкой:
df[, paste0("s", 1L:4L) := {
d <- (mx - mn) / 3
.(mn, mn + d, mn + 2*d, mx)
}]
В общем, thelatemail предложил:
N <- 4L
df[, paste0("s", seq(N)) := transpose(Map(`+`, mn,
lapply((mx - mn) / (N-1), `*`, seq(0, N-1))
))]
Или эквивалентно, но длиннее, но я думаю, что это будет быстрее:
N <- 4L #assuming N >= 2
d <- df[, (mx - mn) / (N - 1)]
init <- df[["mn"]]
for (n in 1L:N) {
set(df, j=paste0("s", n), value=init + (n-1) * d)
}