假设我有以下数据集:
library(data.table)
dt <- data.table(x = c(1, 2, 4, 5, 2, 3, 4))
> dt
x
1: 1
2: 2
3: 4
4: 5
5: 2
6: 3
7: 4
Run Code Online (Sandbox Code Playgroud)
我想在第4行之后截止,从那时起第一个副本(数字2)出现.
预期产出:
x
1: 1
2: 2
3: 4
4: 5
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,我并不dt[1:4, ,][]
认为真正的数据集更"复杂".
我试过了shift()
,.I
但它没有用.一个想法是:dt[x %in% dt$x[1:(.I - 1)], .SD, ][]
.
也许我们可以使用 duplicated
dt[seq_len(which(duplicated(x))[1]-1)]
# x
#1: 1
#2: 2
#3: 4
#4: 5
Run Code Online (Sandbox Code Playgroud)
或者像@lmo建议的那样
dt[seq_len(which.max(duplicated(dt))-1)]
Run Code Online (Sandbox Code Playgroud)
这是另一种选择:
dt[seq_len(anyDuplicated(x)-1L)]
Run Code Online (Sandbox Code Playgroud)
从帮助文件:
anyDuplicated():长度为1的整数或实数向量,其值为第一个副本的从1开始的索引(如果有),否则为0.
但请注意,如果列中没有任何重复,则可能会遇到此方法的问题(以及当前发布的其他方法).
要注意这一点,您可以将其修改为:
dt[if((ix <- anyDuplicated(x)-1L) > 0) seq_len(ix) else seq_len(.N)]
Run Code Online (Sandbox Code Playgroud)
如果没有找到重复,或者只有重复,直到第一个重复之前的行,这将返回所有行.