背景:使用R或者python实现两个数据集的左连接,以此完成部分生信需求。
- python实现
python是我学的第一门编程语言,pandas是我最早接触的处理数据框的库。
首先构建一个测试数据集:
import pandas as pd #'导入pandas库
data_1=pd.DataFrame({"Name":["chenxiangzhi","lianghui","wangling"],"age":[26,26,25]})
data_2=pd.DataFrame({"Name":["chenxiangzhi","lianghui","chenweiman"],"work":["yes","yes","yes"]})
![](https://img.haomeiwen.com/i27952728/f467e12d0608497d.png)
观察这两个数据框,它们有这样一些特征:
1.共有列名Name
2.共有列Name
中部分值相同,都有 chengxiangzhi
和lianghui
,但数据data_1
中的wangling
是data_2
没有的;数据data_2
中的chenweiman
是data_1
没有的
3.除了共有列名Name
外,每个数据表有自己独有的列名
某位老师就说过,这样的两个表单存在于一些常见的场景中,例如:
学校的管理系统中,语文课的成绩表单和数学课的表单如何拼接在一起?选修这两门课的学生名字部分重合,即一部分学生两门课都上,但有一些学生只上了语文课或者只上了数学课,那么反映在表单上,两个成绩表上学生的名字列只有部分相同,另一部分是不同的,除此外,一个表单反映的是语文成绩,而另一个表单则是数学成绩。
data_outer=pd.merge(data_1,data_2,how="outer")
data_outer
data_inner=pd.merge(data_1,data_2,how="inner")
data_inner
data_left=pd.merge(data_1,data_2,how="left")
data_left
data_right=pd.merge(data_1,data_2,how="right")
![](https://img.haomeiwen.com/i27952728/9b17f6575078854f.png)
外连接能够将共有列的所有值拼接在一起,而没有的值会被赋值为NaN;
内连接只将共有列都有的值拼接在一起;
左连接只将共有列中左边表单的值拼接在一起;
右连接则是将共有列中右边表单的值拼接在一起。
- R实现
加载包library(dplyr)
同样先构建测试数据表格:
library(dplyr)
data_1<-data.frame(Name=c("chengxiangzhi","lianghui","wangling"),age=c(26,26,25))
data_2<-data.frame(Name=c("chengxiangzhi","lianghui","chenweiman"),work=c("yes","yes","yes"))
![](https://img.haomeiwen.com/i27952728/228d2c89dc29c5a0.png)
数据格式和之前一样,共有列为
Name
。![](https://img.haomeiwen.com/i27952728/df62c739ba7e7055.png)
- match方法
这是一种类似于左连接,但是又更加灵活的方法。
data_1$work<-data_2[match(data_1$Name,data_2$Name),"work"]
data_1
![](https://img.haomeiwen.com/i27952728/4dbae9a68b5fa2a5.png)
match(a,b)
的主要作用是返回向量a
在向量b
中的位置,在上图数据框data_2中:data_2[match(data_1$Name,data_2$Name),]
返回data_1中Name列在data_2中Name列的位置,并且在行的位置对数据框进行排序data_2[match(data_1$Name,data_2$Name),"work"]
提取排序后data_2中的work列data_1$work<-data_2[match(data_1$Name,data_2$Name),"work"]
将提取出来的列赋值给data_1的work列
match函数结合数据框的方法实现左连接的效果,但却比左连接更加灵活,它不需要两个数据框中共有列的列名一致,甚至可以一个是数据框的列而另一个是数据框的行名,都能实现匹配。
网友评论