r-查找排序文件中唯一行数的最快方法/算法



我当前使用.N来使用by= ... . 查找文件中唯一的行数

例如,为了在数据表dt中找到col1col2的唯一行数,查询将是

dt[, .N, by="col1,col2"]

对于非常大的文件,这可能需要很长时间。如果对表进行排序,有没有更快的方法可以做到这一点?基本上,您可以设置一个计数器,并在每次遇到唯一的行时使用单个条目根据每行出现的次数更新它。我不能使用for循环,因为这需要很长时间。

unique.data.table与基本R unique的不同之处在于,如果设置了键,unique.data.table仅基于data.table的键列获取唯一值。举例说明,

试试这个:

dt <- data.table(x=c(1,1,1,2,2), y=c(5,6,6,7,8))
unique(dt) # no key set, similar to 'unique.data.frame' output
# set key now
setkey(dt, "x")
unique(dt) # unique based on just column x

如果您只想获得唯一行的总数,请尝试以下操作:

setkeyv(dt, c("col1", "col2"))
nrow(unique(dt))

关于您的问题:

dt[, .N, by="col1,col2"]

实际上并没有给你唯一的行数,而这两个行中的任何一个都有:

dt[, .N, by="col1,col2"][, .N] # data.table solution
nrow(dt[, .N, by="col1,col2"]) # data.frame syntax applied to data.table

我对你的问题的回答是:

data.table包的一个核心功能是使用密钥。在data.table包的简短介绍的第2页上,它写道:

此外,行是按键排序的。因此,一个data.table最多可以有一个键,因为它不能在多个键中排序方法

因此,除非您有一列定义了排序顺序,并且可以将其设置为关键字,否则对数据进行排序的事实将没有任何好处。因此,您需要设置关键点。出于您的目的(大的数据文件,因此可能有很多列),您希望在数据集中包括所有列以设置密钥:

setkeyv(dt,c(names(dt))) # use key(dt) to check whether this went as expected
unique(dt)[, .N] # or nrow(unique(dt))

PS:请为我们提供一个可复制的数据集,这样我们就可以评估你认为快还是慢。

最新更新