在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的哪一行。也许下面的例子更加清楚。

编辑:我的愿望输出是具有唯一行的数据表和具有唯一行表中原始表的行位置的向量(即长度为{{1的向量}})

这是到目前为止我发现的最好的解决方案:

nrow(dt)
wz17266 回答:在data.table中使用唯一,但要跟踪原始行(例如,唯一然后匹配)

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返回我匹配的x的行号。如果为NA,则返回x中不匹配的i的行号。默认情况下,返回FALSE并返回x中匹配的行。

也就是说,x(在OP中为unique(DT))的行索引是从与i(此处为DT)的联接中返回的。

,

我们可以在dt.uniq中添加行列之后进行左联接

dt[dt.uniq[,row := seq_len(.N)],on = c('V1','V2')]

#   V1 V2 row
#1:  5  7   1
#2:  5  7   1
#3:  5  5   2
#4:  5  5   2
#5:  5  5   2
#6:  6  7   3
#7:  6  6   4
#8:  6  6   4

数据

library(data.table)
m <- matrix(c(5,5,6,7,6),ncol = 2)
dt <- setDT(as.data.frame(m)) 
dt.uniq <- unique(dt)
本文链接:https://www.f2er.com/3162992.html

大家都在问