[英]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]
最后一個假定m1
和m2
是集合,即不同項目的集合。 如果不是這種情況,您可以通過傳遞它們使它們成為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.