我有一个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
找到该对存在的位置,但我无法弄清楚语法。
答案 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