学习match函数的记录

2022-06-08 20:24:44 浏览数 (1)

我们的生信入门班和数据挖掘线上直播课程已经有了三年多的历史,培养了一波又一波优秀的生信人才,前面我们也发了不少学生的笔记和感悟,这一次想给大家展示一个优秀的“后浪”在老师的启发下自行思考和探索求知的例子,我们的“授人以渔”从来不是说说而已,希望大家都能学到解决问题的思维

下面是学习match函数的记录

(生信技能树学员张俊华)

写在前面

生信技能树2022年5月场数据挖掘班小洁老师讲到了match这个函数。结合上课的内容自己去看了帮助文档,并试着探索了对这个函数的几个疑问,小洁老师对我的探索过程给出指导意见,并提点了这个函数的正确用法。下面对探索过程进行介绍。

match

match是对两个向量进行匹配排序的重要函数;match(x,y) 表示x中的每一个元素,在y中的位置下标,相当于依次将x中的每一个元素提出来,然后在y中进行比对,返回该元素在y中的下标位置。

for example:

代码语言:javascript复制
### 生成两个向量
x <- c("A","B","C","D","E");x
## [1] "A" "B" "C" "D" "E"
y <- c("B","D","E","A","C");y
## [1] "B" "D" "E" "A" "C"
###x和y是内容一样,但顺序不同的两个向量
###思考一下如何让X变成和y一样的顺序呢?
###如果我们能知道y中的每个元素在x中对应的位置下标是不是就可以了?
match(y,x) 
## [1] 2 4 5 1 3
###产生的是y中的每个元素在x中的位置下标,就能用来给x取子集啦
x[match(y,x)]
## [1] "B" "D" "E" "A" "C"

到这里是小洁老师课上讲的match的用法,强调了一下「x和y是两个内容一样,但顺序不一样的向量」

老师说match很重要,它又有些难,我就去看了帮助文档,如下:

总结一下就是:match(x,y)表示x中的每一个元素,在y中的位置下标,相当于依次将x中的每一个元素提出来,然后在y中进行比对,如果存在则返回该元素在y中的下标位置;如果不存在则返回NA;如果x是无法匹配的向量,结果返回NULL。

这里和开始的介绍多了后面两句话,对于NULL的情况我们好像碰不到,先不管它。我的疑问在产生NA值的情况

既然存在x不在y中的情况,那也就是说x和y是可以不同的,创建向量探索一下:

代码语言:javascript复制
###1. 当x和y等长,但内容不完全一致时
x <- c("A","B","C","D","F");x
## [1] "A" "B" "C" "D" "F"
y <- c("B","D","E","A","C");y
## [1] "B" "D" "E" "A" "C"
###match是依次判断y中的每个元素在x中的位置下标,如果没有就返回NA
match(y,x) 
## [1]  2  4 NA  1  3
##所以返回结果如下

##用返回的结果取子集
x[match(y,x)]
## [1] "B" "D" NA  "A" "C"
###2.当x和y不等长时
x <- c("A","B","C","D","F","M","G");x
## [1] "A" "B" "C" "D" "F" "M" "G"
y <- c("B","D","E","A","C");y
## [1] "B" "D" "E" "A" "C"
###这里返回的是x的下标,长度是和y等长的哦
match(y,x) 
## [1]  2  4 NA  1  3
##
x[match(y,x)]
## [1] "B" "D" NA  "A" "C"

对于我的探索,小洁老师给出这样的指导:

于是又思考了一下怎样先把两个向量变成「“符合条件”」,并反馈给小洁老师,于是有了这篇笔记

图片中的代码是这样的哈:

代码语言:javascript复制
###1. 当x和y等长,但内容不完全一致时
x <- c("A","B","C","D","F");x
## [1] "A" "B" "C" "D" "F"
y <- c("B","D","E","A","C");y
## [1] "B" "D" "E" "A" "C"
###先让x,y符合条件
x1<-x[x%in%y];x1
## [1] "A" "B" "C" "D"
y1<-y[y%in%x];y1
## [1] "B" "D" "A" "C"
###match是依次判断y1中的每个元素在x1中的位置下标,如果没有就返回NA
x1[match(y1,x1)] 
## [1] "B" "D" "A" "C"
##############################
###2.当x和y不等长时
x <- c("A","B","C","D","F","M","G");x
## [1] "A" "B" "C" "D" "F" "M" "G"
y <- c("B","D","E","A","C");y
## [1] "B" "D" "E" "A" "C"
###先让二者符合条件
x1<-x[x%in%y];x1
## [1] "A" "B" "C" "D"
y1<-y[y%in%x];y1
## [1] "B" "D" "A" "C"
###
match(y1,x1) 
## [1] 2 4 1 3
##
x1[match(y1,x1)]
## [1] "B" "D" "A" "C"

❝小洁老师的补充说明:match(y,x)最常用的场景是用于两个“内容相同而顺序不同的向量”,其实也可以略微宽松一些,不产生NA的条件是不存在“在x里面有而在y里面没有”的元素,也就是只需要x1<-x[x%in%y]就行了,不把y也相同处理,也是可以的噢。 ❞

其实在搜索match的帮助文档时,你有没有注意到,match下面紧跟着介绍了运算符%in%?

「%in%这个运算符返回逻辑向量TRUE 或者FALSE,(x%in%y)是依次判断x中的元素在不在y中,返回值应该与%in%这个操作符前面的向量(x)长度相等。也就是说它相当于遍历了x里面的一个个元素,判断它们是否在y中出现过,然后返回是或者否」

「而match(x,y)的结果就很不一样了,它的返回结果同样与前面的向量等长,但是它并非返回逻辑向量,而是遍历了x里面的一个个元素,判断它们是否在y中出现过,如果出现就返回在y中的位置下标,如果没有出现,就返回NA。」

引自http://www.bio-info-trainee.com/1071.html,跟着这篇教程进一步学习match和%in%,以及更多的排序,集合运算函数吧!

0 人点赞