最快的方法/算法,用于查找已排序文件的唯一行数

时间:2013-07-13 18:10:22

标签: r data.table

我目前使用.N使用by= ... .

查找文件中唯一行的数量

例如。要在数据表col1中查找col2dt的唯一行数,查询将是,

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

对于非常大的文件,这可能需要很长时间。如果表已排序,是否有更快的方法来执行此操作?基本上,您可以设置一个计数器,并在每次遇到唯一行时使用单个条目更新每行显示的次数。我不能使用for循环,因为这需要永远。

2 个答案:

答案 0 :(得分:1)

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))

答案 1 :(得分:0)

关于你的问题:

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包的核心功能是使用密钥。在第2页,从short introduction到data.table包,它显示为:

  

此外,行按键排序。因此,一个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:请向我们提供一个可复制的数据集,以便我们评估您认为快或慢的内容。