从R中的数据表中提取唯一行

时间:2011-09-26 22:52:06

标签: r data.table

我正在从数据框和矩阵迁移到数据表,但还没有找到从数据表中提取唯一行的解决方案。虽然我还没有在常见问题解答和介绍插图中找到答案,但我认为我对[,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

相关问题:这种行为是数据未分类的结果,与Unix uniq函数一样吗?

2 个答案:

答案 0 :(得分:27)

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

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

因此,旧的行为就像是

DT

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

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

或没有副本

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

答案 1 :(得分: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'))