簡體   English   中英

如何獲得兩個矩陣的交叉?

[英]How do I get the intersect of two matrices?

# These are the two matrices that I would like to subset based on identical
# entries within entire rows.
mata <- matrix(c("A", "B", "C", "F", "D", "E", "F", "G"), 
               nrow = 4, ncol = 2,
               dimnames = list(c(), c("A", "B")))
mata

##      A   B  
## [1,] "A" "D"
## [2,] "B" "E"
## [3,] "C" "F"
## [4,] "F" "G"

matb <- matrix(c("B", "A", "C", "F", "M", "D", "D", "H", "G", "X"), 
               nrow = 5, ncol = 2,
               dimnames = list(c(), c("A", "B")))
matb

##      A   B  
## [1,] "B" "D"
## [2,] "A" "D"
## [3,] "C" "H"
## [4,] "F" "G"
## [5,] "M" "X"

如果兩個矩陣沒有無序且長度相同,則以下代碼應該起作用並且效率很高。

mata[rowMeans(mata == matb) == 1, ]

我的一個hackish解決方案是我想要用於匹配的每個矩陣的各列的串聯。 在這個例子中,我將使用所有列。

mata <- cbind(mata, C = paste0(mata[, "A"], "_", mata[, "B"]))
matb <- cbind(matb, C = paste0(matb[, "A"], "_", matb[, "B"]))
mata[mata[, "C"] %in% matb[, "C"], colnames(mata) != "C"]

##      A   B  
## [1,] "A" "D"
## [2,] "F" "G"

這是我正在尋找的結果,但我想知道是否有一些更優雅的東西,例如矢量的%in%函數。

編輯

該解決方案應適用於矩陣長度不一定相等的一般情況。

你可以使用函數merge()

> merge(mata,matb)
  A B
1 A D
2 F G

如果加載dplyr,則添加intersect.data.frame

library(dplyr)
options(stringsAsFactors=FALSE)
dfa <- as.data.frame(mata)
dfb <- as.data.frame(matb)
intersect(dfa,dfb)

#   A B
# 1 A D
# 2 F G

類似地, unionsetequal (測試集相等)和setdiff (set minus)可用。


在旁邊。 data.frame的每一行對應一個觀察,因此討論交叉的兩組觀察(兩個data.frames)是有意義的。 然而,對於矩陣來說,它確實沒有意義。 這就是為什么如果你想繼續使用矩陣,這個操作需要像OP的解決方案和@ RHertel(它強制在幕后的data.frame)這樣的黑客攻擊。

暫無
暫無

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

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