复制后的data.table截止行

时间:2017-08-30 12:53:58

标签: r data.table

假设我有以下数据集:

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, ][]

2 个答案:

答案 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)]

如果没有找到重复项,或者只有重复项,那么这将返回所有行,直到第一次重复之前的行。