复制后的data.table截止行

Tha*_*uys 4 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
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, ][].

akr*_*run 6

也许我们可以使用 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)

  • 你打败了我5秒钟:这是我的建议:`dt [1:(which.max(duplicated(dt)) - 1)]` (4认同)

tal*_*lat 5

这是另一种选择:

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)

如果没有找到重复,或者只有重复,直到第一个重复之前的行,这将返回所有行.