Вы можете %/%
номер строки минус 1 на 5, чтобы получить группы, затем используйте diff
, чтобы получить разницу от предыдущего x
(или 0, если нет предыдущего x
) от x
для всех столбцов x
для каждой группы.
library(data.table)
setDT(DF)
DF[, lapply(.SD, function(x) diff(c(0, x)))
, (1:nrow(DF) - 1) %/% 5][, -1]
# A B
# 1: 1 11
# 2: 1 1
# 3: 1 1
# 4: 1 1
# 5: 1 1
# 6: 6 16
# 7: 1 1
# 8: 1 1
# 9: 1 1
# 10: 1 1
# 11: 11 21
Или, как упомянул @akrun, вы могли бы избежать lapply
, заменив
lapply(.SD, function(x) diff(c(0, x)))
на
.SD - shift(.SD, fill = 0)
Еще один менее серьезный вариант:
x <- DF[, !(.I - 1) %% 5]
DF*(1 + x) - DF[DF[, .I - !x]]
# A B
# 1: 1 11
# 2: 1 1
# 3: 1 1
# 4: 1 1
# 5: 1 1
# 6: 6 16
# 7: 1 1
# 8: 1 1
# 9: 1 1
# 10: 1 1
# 11: 11 21