左连接-使用R/python实现两个数据的左连接

背景:使用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"]})
dataframe.png

观察这两个数据框,它们有这样一些特征:
1.共有列名Name
2.共有列Name中部分值相同,都有 chengxiangzhilianghui,但数据data_1中的wanglingdata_2没有的;数据data_2中的chenweimandata_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")
pd_merge.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"))

data.frame.png

数据格式和之前一样,共有列为Name
dplyr.png

  • match方法
    这是一种类似于左连接,但是又更加灵活的方法。
data_1$work<-data_2[match(data_1$Name,data_2$Name),"work"]
data_1

match.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函数结合数据框的方法实现左连接的效果,但却比左连接更加灵活,它不需要两个数据框中共有列的列名一致,甚至可以一个是数据框的列而另一个是数据框的行名,都能实现匹配。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容