R编程如何索引重复行?

时间:2016-03-30 09:55:15

标签: r duplicates

我正在尝试在下面的对象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)
    }
  }

2 个答案:

答案 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]