一种简单的方法是使用该duplicated()
功能。当应用于数据帧时,当且仅当行值组合之前未发生时,它会生成一个向量,其中条目为 TRUE,当向下移动数据帧时。
DT$first <- !duplicated( DT[, list(x,y) ])
DT$last <- rev(!duplicated( DT[, list(rev(x),rev(y)) ]))
> DT
x y first last
[1,] a A TRUE TRUE
[2,] a B TRUE TRUE
[3,] a C TRUE FALSE
[4,] a C FALSE TRUE
[5,] b A TRUE TRUE
[6,] b B TRUE TRUE
[7,] b C TRUE FALSE
[8,] b C FALSE FALSE
[9,] b C FALSE FALSE
[10,] b C FALSE TRUE
[11,] c A TRUE FALSE
[12,] c A FALSE TRUE
[13,] c B TRUE FALSE
[14,] c B FALSE TRUE
[15,] c C TRUE FALSE
[16,] c C FALSE FALSE
[17,] c C FALSE TRUE
另一种不使用的方法duplicated()
是:
DT[ unique(DT), list(first = c(1, rep(0,length(y)-1)),
last = c(rep(0,length(y)-1),1 )) ]
x y first last
[1,] a A 1 1
[2,] a B 1 1
[3,] a C 1 0
[4,] a C 0 1
[5,] b A 1 1
[6,] b B 1 1
[7,] b C 1 0
[8,] b C 0 0
[9,] b C 0 0
[10,] b C 0 1
[11,] c A 1 0
[12,] c A 0 1
[13,] c B 1 0
[14,] c B 0 1
[15,] c C 1 0
[16,] c C 0 0
[17,] c C 0 1