1

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

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

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

对于非常大的文件,这可能需要很长时间。如果表格已排序,是否有更快的方法来做到这一点?基本上,您可以设置一个计数器,并在每次遇到唯一行时使用单个条目将其更新为每行出现的次数。我不能使用 for 循环,因为那将永远持续下去。

4

2 回答 2

1

unique.data.table与 base 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))
于 2013-07-13T21:45:54.463 回答
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 包的一个核心特性是使用密钥。在对 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:请向我们提供一个可复制的数据集,以便我们评估您认为的快或慢。

于 2013-07-22T06:50:42.030 回答