给定a data.table,如何找到它包含的唯一键的数量?
library(data.table)
z <- data.table(id=c(1,2,1,3),key="id")
length(unique(z$id))
==> 3
Run Code Online (Sandbox Code Playgroud)
问题是,unique是二次一般,但是,由于在按键data.table的排序,应该可以找到独特的键在数data.table以线性时间.
我将扩大我的评论作为答案.
base::uniqueunique.defaultvector上的()使用哈希表并且非常有效,平均复杂度为O(1) - 这很可能是一般情况.最坏的情况复杂度是O(n).但是每次插入/搜索时发生这种情况的可能性非常少 - 如果确实如此,它必须是一个糟糕的哈希函数.
在你的问题中,你只有一个关键列,因此base的独特性应该非常高效.但是,在多个列上,unique.data.frame效率非常低 - 因为它将所有列强制转换为字符,然后将它们粘贴在一起然后调用unique.default它.
您可以使用:
nrow(unique(z))
Run Code Online (Sandbox Code Playgroud)
unique默认情况下,data.table的方法为其by参数提供键列.而且由于我们知道数据已经排序,而不是排序,我们也可以data.table:::uniqlist更有效地获取对应于唯一行的索引O(n).因此,它对任何数量的关键列都有效.
但是,我们可以在设置密钥时将此信息添加为属性,因为它非常简单.