Я думаю, head
и tail
будут безопаснее и будут использовать уникальные значения один раз для индексов, как упомянуто sindri_baldur:
k <- 3L
DT[unique(DT[, c(head(.I, k), tail(.I, k)), id]$V1)]
вывод:
id VAL
1: 1 1
2: 1 2
3: 1 3
4: 1 5
5: 1 6
6: 1 7
7: 2 8
8: 2 9
9: 2 10
10: 2 11
11: 2 12
12: 2 13
13: 3 14
14: 3 15
15: 3 16
16: 3 17
17: 3 18
18: 4 19
19: 4 20
20: 4 21
21: 4 22
22: 5 23
23: 5 24
24: 5 25
25: 6 26
26: 6 27
27: 7 28
id VAL
данные:
library(data.table)
x <- sort(sequence(7:1))
DT <- data.table(id=x, VAL=1:length(x))