如何查找存在重复对的行索引

时间:2016-08-03 18:55:53

标签: r

我有一个data.frames列表,每个data.frame都是相同格式的单独输出。我可以将所有这些合并到一个带有

的主列表中
master <- do.call("rbind", list)

我有两列特别是(1和3),我想在其中找到重复项,我这样做

unique.pairs <- unique(master[duplicated(master[,c(1,3)]),c(1,3)])

这将给我一个独特的第1,3列配对的数据框架。

现在我想找到,对于每个唯一的一对,这对的其他实例在哪里。理想的输出是一个data.frame,其中一列包含配对(可以将字符串连接到一个),另一列包含master中的行名(可以通过我试图找到的重复索引轻松获得),其中存在重复

一个虚拟示例(剥离到感兴趣的两列):

master <- data.frame(A=c(1,1,2,2,3,3,4,4,5,5), B=c(1,2,3,3,4,5,6,6,7,8))
unique.pairs <- unique(master[duplicated(master,c(1,2)]),c(1,2)])

现在我希望能够生成一个data.frame:

results <- data.frame(instance=c("2->3","4->6"), indices=c("3,4","7,8"))

我在想你遍历每对unique.pairs,然后在master找到该对存在的位置,但我无法弄清楚语法。

2 个答案:

答案 0 :(得分:4)

使用data.table,你可以......

library(data.table)
setDT(master)

master[master[, .N, by=names(master)][ N > 1L ], on=names(master), 
  .(N, locs = .(.I)), by=.EACHI]

#    A B N locs
# 1: 2 3 2  3,4
# 2: 4 6 2  7,8

请注意,我们甚至不需要构建像unique.pairs这样的对象。

N是重复次数。您只需使用.(locs = .(.I))即可从输出中省略它。

答案 1 :(得分:2)

对我来说,unique.pairs构建中出现错误,所以我提供了这个备用:

 unique.pairs <- unique( master[ duplicated(master) ,c(1,2)])

然后使用它来构造第一种类型的向量:

 grps <- apply( master, 1, function(x) if ( any( duplicated( rbind(unique.pairs, x))) ) { paste(x[1],x[2], sep="->")}else{NA} + )
 grps

#[1] NA     NA     "2->3" "2->3" NA     NA     "4->6" "4->6" NA     NA    

然后,您可以使用该向量对其他感兴趣的项目进行分组:

> locs <- tapply( rownames(master), grps, function(x) paste(x, collapse=",") )
> as.data.frame(locs)
     locs
2->3  3,4
4->6  7,8