我目前使用.N
来查找文件中唯一行的数量by= ... .
例如。要查找数据表col1
和中唯一行的计数,查询将是,col2
dt
dt[, .N, by="col1,col2"]
对于非常大的文件,这可能需要很长时间。如果表格已排序,是否有更快的方法来做到这一点?基本上,您可以设置一个计数器,并在每次遇到唯一行时使用单个条目将其更新为每行出现的次数。我不能使用 for 循环,因为那将永远持续下去。
我目前使用.N
来查找文件中唯一行的数量by= ... .
例如。要查找数据表col1
和中唯一行的计数,查询将是,col2
dt
dt[, .N, by="col1,col2"]
对于非常大的文件,这可能需要很长时间。如果表格已排序,是否有更快的方法来做到这一点?基本上,您可以设置一个计数器,并在每次遇到唯一行时使用单个条目将其更新为每行出现的次数。我不能使用 for 循环,因为那将永远持续下去。
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))
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:请向我们提供一个可复制的数据集,以便我们评估您认为的快或慢。