R:data.table 中 setkey() 后重复更改的输出

R: Output of duplicated changes after setkey() in data.table

在合并两个数据集的过程中,我使用函数 duplicated 检查重复条目的数据。无论我在 setkey() 之前还是之后 运行 duplicated,我都会得到两个不同的输出。这是 data.table 中的自然行为吗?在我(拙劣的)看来,重复的数量应该通过设置键来改变,在我的理解中,这只是 data.table 的重新排序和索引。我错过了一些关键点吗?

非常感谢!

这是一个例子data.table:

> DT
   id x1 x2
1:  A  0  1
2:  A  1  1
3:  B  0  1
4:  B  1  0
5:  C  1  1
6:  C  0  0

在这个未加密的数据集上运行 duplicated 我得到没有重复条目的结果,这似乎是有序的。

duplicated(DT)
[1] FALSE FALSE FALSE FALSE FALSE FALSE

然后在使用 setkey() 设置密钥后,我得到以下输出,

setkey(DT,id)
duplicated(DT)
[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE

其中函数指示 3 个重复项。我只是不明白...

这是我用来生成 data.table

的代码
set.seed(123)
id <- rep(LETTERS[1:3],each=2)
x1 <- sample(c(0,1),6,T)
x2 <- sample(c(0,1),6,T)
DT <- data.table(id,x1,x2)

duplicated使用每一列的元素,设置一个或多个键列后,在逐行重复检查中,使用

duplicated(DT,by=NULL)
> [1] FALSE FALSE FALSE FALSE FALSE FALSE

正如文档所述,duplicated 对于 data.table 的行为与基础版本不同,或者当它处理 data.frames.

当您使用 setkey() 设置键时,函数 duplicated 仅检查键列中的行是否重复。在这个问题中,只有 id 被设置为键,所以只有 id 的行(在本例中是列中的元素)被检查是否重复。

如果您在 duplicated 中指定 by 参数,该函数将检查具有 by 中指定的每一列的元素的行是否在 table.

通过设置 by=NULL 考虑所有列,并且该函数检查逐行重复项,其中行向量包含来自所有 columns.This 的元素模仿 duplicated 时的行为处理 data.frames.