假设我有以下数据集:
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
我想在第4行之后切断第一个副本(数字2)。
预期产出:
x
1: 1
2: 2
3: 4
4: 5
毋庸置疑,我不是在寻找dt[1:4, ,][]
,因为真正的数据集更“复杂”。
我尝试使用shift()
,.I
,但它没有用。
一个想法是:dt[x %in% dt$x[1:(.I - 1)], .SD, ][]
。
答案 0 :(得分:6)
也许我们可以使用duplicated
dt[seq_len(which(duplicated(x))[1]-1)]
# x
#1: 1
#2: 2
#3: 4
#4: 5
或@lmo建议
dt[seq_len(which.max(duplicated(dt))-1)]
答案 1 :(得分:5)
这是另一种选择:
dt[seq_len(anyDuplicated(x)-1L)]
从帮助文件:
anyDuplicated():长度为1的整数或实数向量 第一个副本的从1开始的索引(如果有),否则为0。
但请注意,如果您在列中没有任何重复,则可能会遇到此方法的问题(以及当前发布的其他方法)。
为了解决这个问题,您可以将其修改为:
dt[if((ix <- anyDuplicated(x)-1L) > 0) seq_len(ix) else seq_len(.N)]
如果没有找到重复项,或者只有重复项,那么这将返回所有行,直到第一次重复之前的行。