2016-02-21 36 views
0

我目前在R中編寫代碼,這在很大程度上取決於在矩陣上使用set操作。我想知道是否有任何軟件包或預先存在的函數可以比較矩陣行中的每個值。舉例來說,如果我有以下兩個矩陣:在R中對矩陣進行設置操作

A1      A2 
1 1 -1.579122144  10 0.577115944 
2 2 -1.620980244  11 1.263320594 
3 3 -1.156350422  12 -0.524403635 
4 4 0.948909066  13 -1.363554588 
5 5 -0.719925025  14 1.698710773 
6 6 0.642472705  15 0.957670227 
7 7 0.611488905  16 -1.579122144 
8 8 -1.048742921  17 -1.620980244 
9 9 -0.006137041  18 -1.156350422 
10 10 0.577115944  19 0.948909066 
11 11 1.263320594  20 -0.719925025 
12 12 -0.524403635  21 0.642472705 
13 13 -1.363554588  22 0.611488905 
14 14 1.698710773  23 -1.048742921 
15 15 0.957670227  24 -0.006137041 

假設路口函數將返回類似:

>intersect(A1,A2) 
10 0.5771159 
11 1.2633206 
12 -0.5244036 
13 -1.3635546 
14 1.6987108 
15 0.9576702 

也許subset功能,可以在這裏工作,但我不能確定如何實現它。任何有關設置差異,交叉點和聯合功能的幫助將不勝感激。

+1

你所有的矩陣只有一列嗎?如果沒有,那麼在這種情況下如何定義這些操作? – Julius

回答

2

編輯補充2包:sqldfdplyr

您需要可以通過sqldf包來實現輸出。將您的矩陣轉換爲數據框。因此:

A1<-data.frame(x=c(-1.579122144,-1.62098024,-1.156350422,0.948909066,-0.719925025,0.642472705,0.611488905,-1.048742921,-0.006137041,0.577115944,1.263320594,-0.524403635,-1.363554588,1.698710773,0.957670227), id=1:15) 
A2<-data.frame(x=c(0.577115944,1.263320594,-0.524403635,-1.363554588,1.698710773,0.957670227,-1.579122144,-1.62098024,-1.156350422,0.948909066,-0.719925025,0.642472705,0.611488905,-1.048742921,-0.006137041), id=10:24) 

現在使用sqldf包:

library (sqldf) 

sqldf("select * from A1 intersect select * from A2") 

,這將給你的輸出:

x id 
1 -1.3635546 13 
2 -0.5244036 12 
3 0.5771159 10 
4 0.9576702 15 
5 1.2633206 11 
6 1.6987108 14 

OR

您可以使用dplyr包並使用intersect功能:

library(dplyr) 

intersect(A1,A2, by="x") 

這兩個2個包裝應具有功能unionsetdiff

0

基礎R merge()這樣做,與它迫使矩陣來data.frames中,唯一需要注意其所以列名V1V2出現在以下的輸出:

A1 <- matrix(c(1:15,-1.579122144,-1.62098024,-1.156350422,0.948909066,-0.719925025,0.642472705,0.611488905,-1.048742921,-0.006137041,0.577115944,1.263320594,-0.524403635,-1.363554588,1.698710773,0.957670227),15L); 
A2 <- matrix(c(10:24,0.577115944,1.263320594,-0.524403635,-1.363554588,1.698710773,0.957670227,-1.579122144,-1.62098024,-1.156350422,0.948909066,-0.719925025,0.642472705,0.611488905,-1.048742921,-0.006137041),15L); 
o <- lapply(list(A1,A2),capture.output); cat(paste0('A1',paste0(collapse='',rep(' ',nchar(o[[1]][1])-2L+3L)),'A2'),do.call(paste,c(o,sep=' ')),sep='\n'); ## unnecessarily complex line to print the two matrices side-by-side 
## A1      A2 
##  [,1]   [,2]   [,1]   [,2] 
## [1,] 1 -1.579122144 [1,] 10 0.577115944 
## [2,] 2 -1.620980240 [2,] 11 1.263320594 
## [3,] 3 -1.156350422 [3,] 12 -0.524403635 
## [4,] 4 0.948909066 [4,] 13 -1.363554588 
## [5,] 5 -0.719925025 [5,] 14 1.698710773 
## [6,] 6 0.642472705 [6,] 15 0.957670227 
## [7,] 7 0.611488905 [7,] 16 -1.579122144 
## [8,] 8 -1.048742921 [8,] 17 -1.620980240 
## [9,] 9 -0.006137041 [9,] 18 -1.156350422 
## [10,] 10 0.577115944 [10,] 19 0.948909066 
## [11,] 11 1.263320594 [11,] 20 -0.719925025 
## [12,] 12 -0.524403635 [12,] 21 0.642472705 
## [13,] 13 -1.363554588 [13,] 22 0.611488905 
## [14,] 14 1.698710773 [14,] 23 -1.048742921 
## [15,] 15 0.957670227 [15,] 24 -0.006137041 
merge(A1,A2); 
## V1   V2 
## 1 10 0.5771159 
## 2 11 1.2633206 
## 3 12 -0.5244036 
## 4 13 -1.3635546 
## 5 14 1.6987108 
## 6 15 0.9576702 

你可以用0123恢復matrixness,如果需要,請刪除列名稱unname()