我正在尝试在下面的对象DT中找到重复的行,然后给它们一个索引作为分组它们的方式。此代码通过将DT $ newindex设置为2来正确地索引和分组第二组重复项,但由于某种原因,它缺少对象DT中的第一组重复项。我已经使用message()来检查i和p是否正确而且它们是正确的。这有什么不对?
library(data.table)
DT <- data.table(A = rep(1:3, each=4),
B = rep(1:4, each=3),
C = rep(1:2, 6), key = "A,B,C")
dups <- unique(DT[duplicated(DT)])
DT$newindex <- NA
for (p in 1: nrow(dups)) {
for (i in 1:nrow(DT)) {
DT$newindex[i] <- ifelse(DT$A[i]==dups$A[p] & DT$B[i] == dups$B[p] & DT$C[i]== dups$C[p],p,0)
}
}
答案 0 :(得分:3)
要获取索引,您可以执行以下操作:
DT[, newindex:=sapply(1:nrow(DT),
function(x) {
i <- which(sapply(1:nrow(dups), function(y) all(dups[y]==DT[x])))
if (length(i)) i else 0})]
DT
# A B C newindex
# 1: 1 1 1 1
# 2: 1 1 1 1
# 3: 1 1 2 0
# 4: 1 2 2 0
# 5: 2 2 1 0
# 6: 2 2 2 0
# 7: 2 3 1 0
# 8: 2 3 2 0
# 9: 3 3 1 0
#10: 3 4 1 0
#11: 3 4 2 2
#12: 3 4 2 2
答案 1 :(得分:0)
如何粘贴所有列以生成索引?
DT[,ID:=do.call(paste0,.SD)]
然后显示一些有趣的统计数据
DT[,.N,by=ID]