我正在从数据框和矩阵迁移到数据表,但还没有找到从数据表中提取唯一行的解决方案。虽然我还没有在常见问题解答和介绍插图中找到答案,但我认为我对[,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
函数一样吗?
答案 0 :(得分:27)
在data.table v1.9.8之前,unique.data.table
方法的默认行为是使用键来确定应返回唯一组合的列。如果key
为NULL
(默认值),则会获得原始数据集(如在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'))