在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