将两列与另外两列匹配

use*_*600 10 r

我有几行数据(标签分隔).我想找到与每行中两列(第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)

这将所有感兴趣的值连接成因子并进行匹配.

这是一种不太纯粹的解决方案,但更快/更易于管理.


42-*_*42- 9

你没有说明你认为正确的答案是什么,当你谈到"哪里有互惠匹配"时你的术语似乎有点模糊,但是如果我正确理解任务,那就是找到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)