R有许多通过公共列连接数据帧的快速、优雅的方法。我想向你们展示其中的三个: 1。基数R的merge()函数 2。Dplyr的join函数族 3。数据。表的括号语法 一、获取并导入数据 在这个例子中,我将使用我最喜欢的演示数据集之一来自美国交通统计局的航班延误时间。如果您想跟随,请访问http:bit。lyUSFlightDelays并下载您选择的时间段的数据,包括航班日期、ReportingAirline、出发地、目的地和出发时间。还可以获取ReportingAirline的查找表。 或者,你可以下载这两个数据集,加上我在一个文件中的R代码和一个解释不同类型的数据合并的PowerPoint,在这里: 要用基本R读入文件,我首先解压缩航班延误文件,然后用read。csv()导入航班延误数据和代码查找文件。如果您正在运行该代码,则您下载的延迟文件的名称可能与下面代码中的名称不同。另外,请注意查找文件不寻常的。csv扩展名。 unzip(673598238TONTIMEREPORTING。zip) mydfread。csv(673598238TONTIMEREPORTING。csv, sep,,quote) mylookupread。csv(LUNIQUECARRIERS。csv, quote,sep,) 接下来,我将用head()查看这两个文件: head(mydf) FLDATEOPUNIQUECARRIERORIGINDESTDEPDELAYNEWX120190801DLATLDFW31NA220190801DLDFWATL0NA320190801DLIAHATL40NA420190801DLPDXSLC0NA520190801DLSLCPDX0NA620190801DLDTWATL10NA head(mylookup) CodeDescription102QTitanAirways204QTradewindAviation305QComluxAviation,AG406QMasterTopLinhasAereasLtd。507QFlairAirlinesLtd。609QSwiftAir,LLCdbaEasternAirLinesdbaEastern 二、与底R合并 mydf延迟数据帧只有航空公司信息的代码。我想用mylookup中的航空公司名称添加一列。一种基于R的方法是使用merge()函数,使用基本语法merge(df1,df2)。数据帧1和数据帧2的顺序无关紧要,但无论哪个是第一个都被认为是x,第二个是y。华东CIO大会、华东CIO联盟、CDLC中国数字化灯塔大会、CXO数字化研学之旅、数字化江湖讲武堂,数字化江湖大侠传、数字化江湖论剑、CXO系列管理论坛(陆家嘴CXO管理论坛、宁波东钱湖CXO管理论坛等)、数字化转型网,走进灯塔工厂系列、ECIO大会等 如果你想要连接的列没有相同的名称,你需要告诉归并你想要连接的列:by。X为X数据帧的列名,由。Y表示Y,比如merge(df1,df2,by。xdf1ColName,by。ydf2ColName)。 您还可以告诉归并是否需要包含参数all的所有行,包括没有匹配的行,还是只需要匹配的行。X和所有。y。在这种情况下,我想要所有的行从延迟数据;如果查找表中没有航空公司代码,我仍然需要该信息。但我不需要查找表中不在延迟数据中的行(其中有一些已不再飞行的旧航空公司的代码)。因此,所有。xTRUE但所有。yFALSE。代码如下: joineddfmerge(mydf,mylookup,by。xOPUNIQUECARRIER, by。yCode,all。xTRUE,all。yFALSE) 新的连接数据帧包括一个名为Description的列,其中包含基于航空公司代码的航空公司名称: head(joineddf) OPUNIQUECARRIERFLDATEORIGINDESTDEPDELAYNEWXDescription19E20190812JFKSYR0NAEndeavorAirInc。29E20190812TYSDTW0NAEndeavorAirInc。39E20190812ORFLGA0NAEndeavorAirInc。49E20190813IAHMSP6NAEndeavorAirInc。59E20190812DTWJFK58NAEndeavorAirInc。69E20190812SYRJFK0NAEndeavorAirInc。 三、与dplyr连接 dplyr包的连接函数使用SQL数据库语法。左连接意味着:包括左边的所有内容(merge()中的x数据帧是什么)和从右边(y)数据帧匹配的所有行。如果联接列有相同的名称,你只需要leftjoin(x,y)。如果它们没有相同的名称,你需要一个by参数,比如leftjoin(x,y,byc(df1ColNamedf2ColName))。 注意by的语法:它是一个命名向量,左右列名都用引号括起来。 更新:从dplyr1。1。0版本开始(2023年1月29日在CRAN上),dplyr连接有一个额外的by语法,使用joinby(): leftjoin(x,y,byjoinby(df1ColNamedf2ColName)) 新的joinby()帮助函数使用了不带引号的列名和布尔运算符,包的作者说,这个运算符在R上下文中比在c上下文中更有意义(col1col2),因为是为了给变量赋值,而不是测试是否相等。 左连接保留左数据帧中的所有行,只匹配来自右数据帧的行。 下面是使用leftjoin()导入和合并两个数据集的代码。它首先加载dplyr和readr包,然后用readcsv()读入这两个文件。当使用readcsv()时,我不需要先解压缩文件。 library(dplyr) library(readr) mytibblereadcsv(673598238TONTIMEREPORTING。zip) mylookuptibblereadcsv(LUNIQUECARRIERS。csv) joinedtibbleleftjoin(mytibble,mylookuptibble, byjoinby(OPUNIQUECARRIERCode)) 注意,dplyr的旧by语法没有joinby()仍然有效 joinedtibbleleftjoin(mytibble,mylookuptibble, byc(OPUNIQUECARRIERCode)) Readcsv()创建tibbles,这是一种具有一些额外功能的数据帧类型。Leftjoin()将两者合并。看一下语法:在这种情况下,顺序很重要。Leftjoin()意味着包含左边或第一个数据集的所有行,但只包含与第二个数据集匹配的行。并且,因为我需要通过两个不同名称的列来连接,所以我包含了一个by参数。 在dplyr的开发版中,新的连接语法是: joinedtibble2leftjoin(mytibble,mylookuptibble, byjoinby(OPUNIQUECARRIERCode)) 但是,由于大多数人可能都有CRAN版本,所以在本文的其余部分中,我将使用dplyr最初的命名向量语法,直到joinby()成为CRAN版本的一部分。 我们可以使用dplyr的glimpse()函数查看结果的结构,这是查看数据帧顶部几项的另一种方式: glimpse(joinedtibble)Observations:658,461Variables:7 FLDATE20190801,20190801,20190801,20190801,20190801 OPUNIQUECARRIERDL,DL,DL,DL,DL,DL,DL,DL,DL,DL, ORIGINATL,DFW,IAH,PDX,SLC,DTW,ATL,MSP,JF DESTDFW,ATL,ATL,SLC,PDX,ATL,DTW,JFK,MS DEPDELAYNEW31,0,40,0,0,10,0,22,0,0,0,17,5,2,0,0,8,0, X6NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA, DescriptionDeltaAirLinesInc。,DeltaAirLinesInc。,DeltaAir 这个合并的数据集现在有一个新列,列中包含航空公司的名称。如果您自己运行这段代码的一个版本,您可能会注意到dplyr比基数R快得多。 原文: Rhasanumberofquick,elegantwaystojoindataframesbyacommoncolumn。I’dliketoshowyouthreeofthem: baseR’smerge()function dplyr’sjoinfamilyoffunctions data。table’sbracketsyntaxGetandimportthedata ForthisexampleI’lluseoneofmyfavoritedemodatasetsflightdelaytimesfromtheU。S。BureauofTransportationStatistics。Ifyouwanttofollowalong,headtohttp:bit。lyUSFlightDelaysanddownloaddataforthetimeframeofyourchoicewiththecolumnsFlightDate,ReportingAirline,Origin,Destination,andDepartureDelayMinutes。AlsogetthelookuptableforReportingAirline。 Or,youcandownloadthesetwodatasetsplusmyRcodeinasinglefileandaPowerPointexplainingdifferenttypesofdatamergeshere: ToreadinthefilewithbaseR,I’dfirstunziptheflightdelayfileandthenimportbothflightdelaydataandthecodelookupfilewithread。csv()。Ifyou’rerunningthecode,thedelayfileyoudownloadedwilllikelyhaveadifferentnamethaninthecodebelow。Also,notethelookupfile’sunusual。csvextension。 unzip(673598238TONTIMEREPORTING。zip) mydfread。csv(673598238TONTIMEREPORTING。csv, sep,,quote) mylookupread。csv(LUNIQUECARRIERS。csv, quote,sep,) Next,I’lltakeapeekatbothfileswithhead(): head(mydf) FLDATEOPUNIQUECARRIERORIGINDESTDEPDELAYNEWX120190801DLATLDFW31NA220190801DLDFWATL0NA320190801DLIAHATL40NA420190801DLPDXSLC0NA520190801DLSLCPDX0NA620190801DLDTWATL10NA head(mylookup) CodeDescription102QTitanAirways204QTradewindAviation305QComluxAviation,AG406QMasterTopLinhasAereasLtd。507QFlairAirlinesLtd。609QSwiftAir,LLCdbaEasternAirLinesdbaEasternMergeswithbaseR Themydfdelaydataframeonlyhasairlineinformationbycode。I’dliketoaddacolumnwiththeairlinenamesfrommylookup。OnebaseRwaytodothisiswiththemerge()function,usingthebasicsyntaxmerge(df1,df2)。Theorderofdataframe1anddataframe2doesntmatter,butwhicheveroneisfirstisconsideredxandthesecondoneisy。 Ifthecolumnsyouwanttojoinbydon’thavethesamename,youneedtotellmergewhichcolumnsyouwanttojoinby:by。xforthexdataframecolumnname,andby。yfortheyone,suchasmerge(df1,df2,by。xdf1ColName,by。ydf2ColName)。 Youcanalsotellmergewhetheryouwantallrows,includingoneswithoutamatch,orjustrowsthatmatch,withtheargumentsall。xandall。y。Inthiscase,I’dlikealltherowsfromthedelaydata;ifthere’snoairlinecodeinthelookuptable,Istillwanttheinformation。ButIdon’tneedrowsfromthelookuptablethataren’tinthedelaydata(therearesomecodesforoldairlinesthatdon’tflyanymoreinthere)。So,all。xequalsTRUEbutall。yequalsFALSE。Heresthecode: joineddfmerge(mydf,mylookup,by。xOPUNIQUECARRIER, by。yCode,all。xTRUE,all。yFALSE) ThenewjoineddataframeincludesacolumncalledDescriptionwiththenameoftheairlinebasedonthecarriercode: head(joineddf) OPUNIQUECARRIERFLDATEORIGINDESTDEPDELAYNEWXDescription19E20190812JFKSYR0NAEndeavorAirInc。29E20190812TYSDTW0NAEndeavorAirInc。39E20190812ORFLGA0NAEndeavorAirInc。49E20190813IAHMSP6NAEndeavorAirInc。59E20190812DTWJFK58NAEndeavorAirInc。69E20190812SYRJFK0NAEndeavorAirInc。Joinswithdplyr ThedplyrpackageusesSQLdatabasesyntaxforitsjoinfunctions。Aleftjoinmeans:Includeeverythingontheleft(whatwasthexdataframeinmerge())andallrowsthatmatchfromtheright(y)dataframe。Ifthejoincolumnshavethesamename,allyouneedisleftjoin(x,y)。Iftheydon’thavethesamename,youneedabyargument,suchasleftjoin(x,y,byc(df1ColNamedf2ColName))。 Notethesyntaxforby:It’sanamedvector,withboththeleftandrightcolumnnamesinquotationmarks。 Update:Startingwithdplyrversion1。1。0(onCRANasofJanuary29,2023),dplyrjoinshaveanadditionalbysyntaxusingjoinby(): leftjoin(x,y,byjoinby(df1ColNamedf2ColName)) Thenewjoinby()helperfunctionusesunquotedcolumnnamesandthebooleanoperator,whichpackageauthorssaymakesmoresenseinanRcontextthanc(col1col2),sinceismeantforassigningavaluetoavariable,nottestingforequality。 Aleftjoinkeepsallrowsintheleftdataframeandonlymatchingrowsfromtherightdataframe。 Thecodetoimportandmergebothdatasetsusingleftjoin()isbelow。Itstartsbyloadingthedplyrandreadrpackages,andthenreadsinthetwofileswithreadcsv()。Whenusingreadcsv(),Idon’tneedtounzipthefilefirst。 library(dplyr) library(readr) mytibblereadcsv(673598238TONTIMEREPORTING。zip) mylookuptibblereadcsv(LUNIQUECARRIERS。csv) joinedtibbleleftjoin(mytibble,mylookuptibble, byjoinby(OPUNIQUECARRIERCode)) Notethatdplyrsolderbysyntaxwithoutjoinby()stillworks joinedtibbleleftjoin(mytibble,mylookuptibble, byc(OPUNIQUECARRIERCode)) readcsv()createstibbles,whichareatypeofdataframewithsomeextrafeatures。leftjoin()mergesthetwo。Takealookatthesyntax:Inthiscase,ordermatters。leftjoin()meansincludeallrowsontheleft,orfirst,dataset,butonlyrowsthatmatchfromthesecondone。And,becauseIneedtojoinbytwodifferentlynamedcolumns,Iincludedabyargument。 Thenewjoinsyntaxinthedevelopmentonlyversionofdplyrwouldbe: joinedtibble2leftjoin(mytibble,mylookuptibble, byjoinby(OPUNIQUECARRIERCode)) SincemostpeoplelikelyhavetheCRANversion,however,Iwillusedplyrsoriginalnamedvectorsyntaxintherestofthisarticle,untiljoinby()becomespartoftheCRANversion。 Wecanlookatthestructureoftheresultwithdplyr’sglimpse()function,whichisanotherwaytoseethetopfewitemsofadataframe: glimpse(joinedtibble)Observations:658,461Variables:7 FLDATE20190801,20190801,20190801,20190801,20190801 OPUNIQUECARRIERDL,DL,DL,DL,DL,DL,DL,DL,DL,DL, ORIGINATL,DFW,IAH,PDX,SLC,DTW,ATL,MSP,JF DESTDFW,ATL,ATL,SLC,PDX,ATL,DTW,JFK,MS DEPDELAYNEW31,0,40,0,0,10,0,22,0,0,0,17,5,2,0,0,8,0, X6NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA, DescriptionDeltaAirLinesInc。,DeltaAirLinesInc。,DeltaAir Thisjoineddatasetnowhasanewcolumnwiththenameoftheairline。Ifyourunaversionofthiscodeyourself,you’llprobablynoticethatdplyriswayfasterthanbaseR。 CXO联盟(CXOunion)是一家聚焦于CIO,CDO,cto,ciso,cfo,coo,chro,cpo,ceo等人群的平台组织,其中在CIO会议领域的领头羊,目前举办了大量的CIO大会、CIO论坛、CIO活动、CIO会议、CIO峰会、CIO会展。如华东CIO会议、华南cio会议、华北cio会议、中国cio会议、西部CIO会议。在这里,你可以参加大量的IT大会、IT行业会议、IT行业论坛、IT行业会展、数字化论坛、数字化转型论坛,在这里你可以认识很多的首席信息官、首席数字官、首席财务官、首席技术官、首席人力资源官、首席运营官、首席执行官、IT总监、财务总监、信息总监、运营总监、采购总监、供应链总监。 数字化转型网(www。szhzxw。cn资讯媒体,是企业数字化转型的必读参考,在这里你可以学习大量的知识,如财务数字化转型、供应链数字化转型、运营数字化转型、生产数字化转型、人力资源数字化转型、市场营销数字化转型。通过关注我们的公众号,你就知道如何实现企业数字化转型?数字化转型如何做? 【CXO联盟部分会员】兴达投资集团CEO、江苏中超投资集团CEO、江苏江润铜业CEO、浙江协和集团CEO、山东垦利石化集团CEO、江苏长电科技股份CEO、重庆钢铁股份CEO、天合光能股份CEO、江苏恒瑞医药股份CEO、奥盛集团CEO、山鹰国际控股股份公司CEO、成都蛟龙投资CEO、宜宾天原集团股份CEO、胜达集团CEO、三宝集团股份CEO、山西晋城钢铁控股集团CEO、河北鑫达钢铁集团CEO、深圳市中金岭南有色金属股份CEO、宁波申洲针织CEO、广西柳工集团CEO、苏州创元投资发展(集团)CEO、邯郸正大制管CEO、人福医药集团股份公司CEO、浙江升华控股集团CEO、河南济源钢铁(集团)CEO、达利食品集团CEO、广西汽车集团CEO、孝义市鹏飞实业CEO、宗申产业集团CEO、天津纺织集团(控股)CEO、晶澳太阳能科技股份CEO、唐山瑞丰钢铁(集团)CEO、重庆万达薄板CEO、唐山三友集团CEO、凌源钢铁集团CEO、宁波博洋控股集团CEO、天津市医药集团CEO、福建省汽车工业集团CEO、山西安泰控股集团CEO、牧原食品股份CEO、上海仪电(集团)CEO、上海胜华电缆(集团)CEO、大亚科技集团CEO、天津恒兴集团CEO、攀枝花钢城集团CEO、桂林力源粮油食品集团CEO、万马联合控股集团CEO、山东鑫海科技股份CEO、江苏上上电缆集团CEO、广西贵港钢铁集团CEO、久立集团股份CEO