首页 > 解决方案 > 在 data.table 中使用唯一但跟踪原始行(例如唯一然后匹配)

问题描述

我对这个美好社区的第一个问题:

我想知道是否有更有效的方法来执行此操作,但使用 data.table:

# vector example
all <- c(4,4,2,1,2)
(uniq <- unique(all))
## [1] 4 2 1
match(all,uniq)
## [1] 1 1 2 3 2

这个想法是从 data.table 中获取所有唯一行,但同时,为原始 data.table 的每一行识别它与唯一 DT 的哪一行匹配。也许下面的例子更清楚。

编辑:我想要的输出是具有唯一行的数据表和具有唯一行表中原始表行位置的向量(即长度向量nrow(dt)

这是迄今为止我发现的最佳解决方案:

library(data.table) # data.table 1.12.0
# small data.table example   ## edited to be reproducible 
m <- matrix(c(5, 5, 5, 5, 6, 5, 6, 6, 7, 7, 5, 5, 7, 5, 6, 6), nrow = 8, ncol = 2)
dt <- setDT(as.data.frame(m)) 
dt.uniq <- unique(dt)

#this returns the ID or position of the rows in the first table on the second table
match(transpose(dt), transpose(dt.uniq))
## [1] 1 1 2 2 3 2 4 4

标签: rdata.tablematchunique

解决方案


这是data.table版本 1.12.4 的一种可能方法:

DT[, urow := unique(DT)[DT, on=.NATURAL, which=TRUE]]

输出:

   V1 V2 urow
1:  7  5    1
2:  5  6    2
3:  6  5    3
4:  7  6    4
5:  7  7    5
6:  7  6    4
7:  7  5    1
8:  6  6    6

数据:

library(data.table) #data.table_1.12.4
set.seed(9L)
DT <- as.data.table(matrix(sample(5:7, 16, replace = T), nrow = 8, ncol = 2))
DT

编辑以解决评论:

1)on=.NATURAL

?data.table下面的参数部分on

当提供 .NATURAL 关键字时,会进行自然连接(在公共列上连接)。

也就是说,在 中X[Y, on=.NATURAL],用于连接的键是在 X 和 Y ( )中都可以找到的列。intersect(names(X), names(Y))

2)which=TRUE

?data.table下面的参数部分which

TRUE 返回 i 匹配的 x 的行号。如果 NA,则返回在 x 中不匹配的 i 的行号。默认情况下 FALSE 并返回 x 中匹配的行。

也就是说,x(unique(DT)在 OP 中) 的行索引是从与i(DT这里) 的连接中返回的。


推荐阅读