将组中的负值之前的所有行子集

Vit*_*nko 1 r data.table

我有data.table

X = data.table(x = c(1,1,1,1,1,2,2,2,2,2), y = c(3,2,1,-1,5,7,4,-2,3,5))
Run Code Online (Sandbox Code Playgroud)

我想仅在一个组中对仅在负值之上的行进行子集化:

res = data.table(x = c(1,1,1,2,2), y = c(3,2,1,7,4)
Run Code Online (Sandbox Code Playgroud)

从第一组中的五个值开始,我想只获得前三个,因为第四个是负数,而第二个组是相同的.

tal*_*lat 5

这有两个选择:

X[, .SD[seq_len(which.max(y<0)-1L)], by = x]
Run Code Online (Sandbox Code Playgroud)

或者(可能更有效,因为它避免了.SD):

X[ X[, .I[seq_len(which.max(y<0)-1L)], by = x]$V1 ]
Run Code Online (Sandbox Code Playgroud)