![](/img/trans.png)
[英]Extract row indices where duplicated pairs exist and the values of these rows which are different
[英]How to find row indices where duplicated pairs exist
我有一個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。
現在,我想為每個唯一對查找該對的其他實例在哪里。 理想的輸出將是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
對中該對的位置,但我無法弄清楚語法。
使用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))
從輸出中將其忽略。
在我看來,您的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.