首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中矩阵的集合运算

R中矩阵的集合运算
EN

Stack Overflow用户
提问于 2016-02-21 09:15:20
回答 2查看 196关注 0票数 0

我目前正在用R编写代码,这在很大程度上依赖于对矩阵进行集合操作。我想知道是否有任何包或预先存在的函数可以比较矩阵中一行中的每个值。例如,如果我有以下两个矩阵:

代码语言:javascript
复制
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

假设的交集函数将返回如下内容:

代码语言:javascript
复制
>intersect(A1,A2)
10  0.5771159
11  1.2633206
12 -0.5244036
13 -1.3635546
14  1.6987108
15  0.9576702

也许subset函数可以在这里工作,但我不确定如何实现它。在设置差异、交集和并集函数方面的任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2016-02-21 10:38:21

编辑后添加了2个包:sqldfdplyr

您需要的输出可以通过sqldf包实现。将矩阵转换为数据帧。因此:

代码语言:javascript
复制
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包:

代码语言:javascript
复制
library (sqldf)

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

这将给出您的输出:

代码语言:javascript
复制
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

您可以使用dplyr包并使用intersect函数:

代码语言:javascript
复制
library(dplyr)

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

这两个包都应该具有unionsetdiff等功能

票数 2
EN

Stack Overflow用户

发布于 2016-02-21 17:37:51

Base R merge()做到了这一点,唯一的警告是它强制矩阵为data.frames,这就是列名V1V2出现在以下输出中的原因:

代码语言:javascript
复制
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

如果需要,可以使用as.matrix()恢复矩阵,并使用unname()删除列名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35531130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档