Подход, использующий некоторое индексирование, которое должно быть эффективным во время выполнения.
Однако не очень эффективный с точки зрения памяти, поскольку делает копию того же размера, что и входные данные:
vars <- paste0("v",1:5)
nv <- dat[vars][cbind(seq_len(nrow(dat)), dat$pos-1)]
ow <- col(dat[vars]) >= dat$pos
dat[vars][ow] <- nv[row(ow)[ow]]
# id v1 v2 v3 v4 v5 pos
#1 1 11 12 12 12 12 3
#2 2 17 11 22 22 22 4
#3 1 11 11 11 11 11 2
Пояснение:
Получить интересующие переменные:
vars <- paste0("v",1:5)
Получить новые значения для перезаписи для каждой строки:
nv <- dat[vars][cbind(seq_len(nrow(dat)), dat$pos-1)]
Сделать логическую матрицу ячеек для перезаписи
ow <- col(dat[vars]) >= dat$pos
Перезапишите ячейки, используя идентификатор строки, чтобы выбрать подходящее значение.
dat[vars][ow] <- nv[row(ow)[ow]]
Быстрая сравнительная синхронизация с использованием большего набора данных:
dat <- dat[rep(1:3,1e6),]
# indexing
# user system elapsed
# 1.36 0.31 1.68
# apply
# user system elapsed
# 77.30 0.83 78.41
# gather/spread
# user system elapsed
# 293.43 3.64 299.10