28

我正在从数据框和矩阵迁移到数据表,但还没有找到从数据表中提取唯一行的解决方案。我想我在[,J]符号方面遗漏了一些东西,尽管我还没有在常见问题解答和介绍小插曲中找到答案。如何在不转换回数据帧的情况下提取唯一行?

这是一个例子:

library(data.table)
set.seed(123)
a <- matrix(sample(2, 120, replace = TRUE), ncol = 3)
a <- as.data.frame(a)
b <- as.data.table(a)

# Confirm dimensionality
dim(a) # 40  3
dim(b) # 40  3

# Unique rows using all columns
dim(unique(a))  # 8 3
dim(unique(b))  # 34 3

# Unique rows using only a subset of columns
dim(unique(a[,c("V1","V2")]))   # 4 2
dim(unique(b[,list(V1,V2)]))    # 29 2

相关问题:这种行为是否是数据未排序的结果,就像 Unixuniq函数一样?

4

2 回答 2

32

在 data.table v1.9.8 之前,unique.data.table方法的默认行为是使用键来确定应该返回唯一组合的列。如果keyNULL(默认值),则可以取回原始数据集(如在 OP 情况下)。

从 data.table 1.9.8+ 开始,unique.data.table方法默认使用所有列,这与unique.data.frame基础 R 中的一致。要让它使用键列,请显式传入by = key(DT)(uniqueDT对键的调用中替换为数据的名称。桌子)。

因此,旧行为将类似于

library(data.table) v1.9.7-
set.seed(123)
a <- as.data.frame(matrix(sample(2, 120, replace = TRUE), ncol = 3))
b <- data.table(a, key = names(a))
## key(b)
## [1] "V1" "V2" "V3"
dim(unique(b)) 
## [1] 8 3

而对于 data.table v1.9.8+,只需

b <- data.table(a) 
dim(unique(b)) 
## [1] 8 3
## or dim(unique(b, by = key(b)) # in case you have keys you want to use them

或者没有副本

setDT(a)
dim(unique(a))
## [1] 8 3
于 2011-09-26T23:22:32.140 回答
7

正如 Seth 所提到的,data.table 包已经发展,现在为此提出了优化的功能。

对于所有不想进入文档的人,这里是做你想做的最快和最节省内存的方法:

uniqueN(a)

如果您只想选择列的子集,您可以使用 'by' 参数:

uniqueN(a,by = c('V1','V2'))

编辑:正如评论中提到的,这只会给出唯一行的计数。要获取唯一值,请改用 unique :

unique(a)

对于一个子集:

unique(a[c('V1',"V2")], by=c('V1','V2'))

于 2017-06-07T08:25:06.030 回答