簡體   English   中英

R:矩陣的交集

[英]R:intersection of matrices

我期待這是一項簡單的任務,但令我驚訝的是,我無法找到解決方案。

我必須對矩陣執行set操作。 相交函數適用於矢量。 但是對於矩陣,他們也將每列視為矢量。 我需要行 - 行比較而不是矩陣的每個元素。

考慮以下兩個矩陣

> m1
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

> m2
     [,1] [,2]
[1,]    1    6
[2,]    3    8
[3,]    4    9
[4,]    5   10
[5,]    6   11

有沒有辦法取兩個矩陣的交集,所以輸出必須只返回第一行?

最有效的方法(恕我直言)是:

如果要比較的行i要行i (我不會把路口 ):

m1[rowSums(m1 == m2) == ncol(m1), , drop = FALSE]

如果你想比較第i行和任何第j行(我稱之為交集 ):

m3 <- rbind(m1, m2)
m3[duplicated(m3), , drop = FALSE]

最后一個假定m1m2是集合,即不同項目的集合。 如果不是這種情況,您可以通過傳遞它們使它們成為unique集合: m3 <- rbind(unique(m1), unique(m2))

兩者都比使用apply快得多。

用這個:

m1[apply(m1==m2, 1, all),]

進行配對比較; 還有這個:

o <- outer(seq_len(nrow(m1)), seq_len(nrow(m2)), Vectorize(
    function(i, j) all(m1[i,]==m2[j,])
))
m1[apply(o, 1, any),]
m2[apply(o, 2, any),]

在所有行m1 (分別m2是在等於一些其他行) m2 (相應的m1 )。

看起來你只想進行行間比較。
在這種情況下,您可以使用

 m1[m1==m2, ]

如果要比較所有行,請使用類似的內容

 m1[apply(m1, 1, function(r) any(ncol(m2)==rowSums(r==m2))), ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM