我有几行数据(标签分隔).我想找到与每行中两列(第3和第4列)中的元素匹配的行,其中包含另外两列(第10和第11列).例如,在行1中,列3和4中的95428891和95443771 匹配行19中的列10和11中的元素.同样,倒数也是如此.中的元素的列3和4中第19行也匹配元件列10和11在第1行.我需要能够遍历每一行并输出相应匹配的行索引.有时可能只有一列匹配而不是两者(因为有时会有重复的数字),但我只需要选择两列匹配的行以及相互匹配的行.因此,输出具有倒数匹配的行索引是个好主意,例如,1和19作为制表符分隔值(可能在不同的data.frame对象中).并且没有相互匹配的行可以单独输出.我试图在R中实现它来运行几行数据.
1313 chr2 95428891 95443771 14880 chr2:96036782 205673 + chr2 96036782 96052481
1313 chr2 95428896 95443771 14875 chr2:97111880 205214 - chr2 97111880 97127588
1313 chr2 95443771 95526464 82693 chr2:95609272 1748861 - chr2 95609272 95691902
1313 chr2 95477143 95486318 9175 chr2:97616847 177391 + chr2 97616847 97626039
1313 chr2 95486323 95521267 34944 chr2:97035158 268351 + chr2 97035158 97070183
1313 chr2 95515418 95525958 10540 chr2:95563236 132439 + chr2 95563236 95572666
1314 chr2 95563236 95572666 9430 chr2:95515418 132439 + chr2 95515418 95525958
1314 chr2 95563236 95572666 9430 chr2:95609778 126017 - chr2 95609778 95620287
1314 chr2 95563236 95569115 5879 chr2:97064308 89848 + chr2 97064308 97070183
164 chr2 95609272 95691902 82630 chr2:95443771 1748861 - chr2 95443771 95526464
1314 chr2 95609778 95620287 10509 chr2:95563236 126017 - chr2 95563236 95572666
1314 chr2 95614473 95649363 34890 chr2:97035158 394821 - chr2 97035158 97070173
1314 chr2 95649368 95658543 9175 chr2:97616847 177822 - chr2 97616847 97626039
164 chr2 95775062 95814080 39018 chr2:97578938 0 - chr2 97578938 97616780
1315 chr2 95778788 95781856 3068 chr2:97609982 31302 - chr2 97609982 97616788
164 chr2 95780657 95829665 49008 chr2:96053880 882178 - chr2 96053880 96102738
1316 chr2 95829982 95865446 35464 chr2:97296848 242680 - chr2 97296848 97333087
1316 chr2 95829982 95935104 105122 chr2:97438085 1169669 + chr2 97438085 97544431
1317 chr2 96036782 96052481 15699 chr2:95428891 205673 + chr2 95428891 95443771
Run Code Online (Sandbox Code Playgroud)
har*_*gnj 20
DWin的答案是可靠的,但是对于大型数组,通常超过50k左右,你会遇到内存问题,因为你创建的矩阵是巨大的.
我会这样做:
match(
interaction( indat$V3, indat$V10),
interaction( indat$V4, indat$V11)
);
Run Code Online (Sandbox Code Playgroud)
这将所有感兴趣的值连接成因子并进行匹配.
这是一种不太纯粹的解决方案,但更快/更易于管理.
你没有说明你认为正确的答案是什么,当你谈到"哪里有互惠匹配"时你的术语似乎有点模糊,但是如果我正确理解任务,那就是找到col.3 == col的所有行. 10&col.4 == col.11,那么这应该完成任务:
which( outer(indat$V4, indat$V11, "==") &
outer(indat$V3, indat$V10, "=="),
arr.ind=TRUE)
# result
row col
[1,] 19 1
[2,] 10 3
[3,] 7 6
[4,] 8 6
[5,] 6 7
[6,] 11 8
[7,] 3 10
[8,] 7 11
[9,] 8 11
[10,] 1 19
Run Code Online (Sandbox Code Playgroud)
外部函数将函数'FUN'(在本例中为"==")应用于x和y的所有双向组合,即它的第一个和第二个参数,所以这里我们得到一个带有逻辑条目的nxn矩阵,我正在使用两个这样的矩阵的逻辑'和'.所以与其他行匹配的行是:
unique( c(which( outer(indat$V4, indat$V11, "==") &
outer(indat$V3, indat$V10, "=="),
arr.ind=TRUE) ))
#[1] 19 10 7 8 6 11 3 1
Run Code Online (Sandbox Code Playgroud)
假设一个名为indat的data.frame,那么没有匹配的集合是:
matches <- unique( c(which( outer(indat$V4, indat$V11, "==") &
outer(indat$V3, indat$V10, "=="), arr.ind=TRUE) ))
indat[ ! 1:NROW(indat) %in% matches, ]
Run Code Online (Sandbox Code Playgroud)
有匹配的是:
indat[ 1:NROW(indat) %in% matches, ]
Run Code Online (Sandbox Code Playgroud)