MATLAB高級數據結構連載5: table 3

本文所有內容僅代表本人觀點,和MathWorks無關

表之間的操作

熟悉SQL語言的讀者對連接的概念應該不會陌生,連接就是把兩個或者多個表按照一定的邏輯組合起來。MATLAB的table對象也支持表之間的連接運算,包括內連接,左右連接,全連接。為了節省篇幅,這節略去table對象的構造過程,直接介紹各種連接函數和連接的結果。(本節Employee和Department的例子參考了維基SQL條目)下例表Table.1和Table.2是要使用的原始數據:

Table.1 Employee表A

Employee DepartmentIDnRafferty 31nJones 33nSteinberg 33nRobinson 34nSmith 34nJasper 35n

Table.2 Employee表B

DepartmentID DepartmentNamen31 Salesn32 Foundationn33 Engineeringn34 HRn35 Marketingn

Table.1中有員工的LastName和所在部門的號碼,而表Table.2中有部門號碼對應的名字,如果我們想知道每個員工所在部門的名字,要查兩次表:首先從表Table.1得到某員工所在部門的號碼,再通過這個號碼去到表Table.2中去找到對應的名字,這樣做不是很方便。

如果能把表Table.2和表Table.2中的DepartmentID「對上」,從而構造出一個有三列數據的新表,並且其中三列分別是LastName,DepartmentID,DepartmentName,那麼就只用查一次表了,這個操作其實就是table的join操作。

% joinn>> t1 = join(A,B) % join的第一個參數叫做左表,第二個參數叫做右表nt1 = n LastName DepartmentID DepartmentNamen ___________ ____________ ______________n Rafferty 31 Sales n Jones 33 Engineering n Steinberg 33 Engineering n Robinson 34 HR n Smith 34 HR n Jasper 35 Marketing n

其中join函數的第一個參數叫做左表,第二個參數叫做右表。

t1用表格形式表示如Table.3所示,請讀者自行核對。為了說明左連接,右連接和全連接,我們把表Table.1稍作修改,把最後一行Jasper的DepartmentID改成36,如表Table.4

Table.3 join(A,B)

Employee DepartmentID DepartmentName n nRafferty 31 SalesnJones 33 EngineeringnSteinberg 33 EngineeringnRobinson 34 HRnSmith 34 HRnJasper 35 Marketingn

Table.4 Employee表C

Employee DepartmentIDnRafferty 31nJones 33nSteinberg 33nRobinson 34nSmith 34nJasper 36n

所謂左連接,即連接結果表中將包含"左表"的所有記錄, 即使那些記錄在"右表" 沒有符合連接條件的匹配。

% 左連接n>> t3 = outerjoin(C,B,Type,left,MergeKeys,true)nt3 = n LastName DepartmentID DepartmentNamen ___________ ____________ ______________nn Rafferty 31 Sales n Jones 33 Engineering n Steinberg 33 Engineering n Robinson 34 HR n Smith 34 HR n Jasper 36 %<----- n

觀察t3的結果,其中左表Table.4 中Jasper的DepartmentID是36,在表 Table.2中沒有任何對應的行,但是左連接的結果t3中仍然保存了Japser項,並且其對應的DepartmentName為默認空字串。

所謂右外連接, 與左外連接完全類似, 只不過是作連接的表的順序相反而已. 如果「左表」右連接「右表」, 那麼"右表" 中的每一行在連接表中至少會出現一次.

如果 「右表」的記錄在"左表"中未找到匹配行, 連接表中來源於「左表」的列的值設為默認空值。右表Table.2中的DepartmentID 35和36在表Table.4都沒有任何員工與之對應,但是右連接的結果t4保留了這些沒有員工對應的Department。

% 右連接n>> t4 = outerjoin(C,B,Type,right,MergeKeys,true)nt4 = n LastName DepartmentID DepartmentNamen ___________ ____________ ______________nn Rafferty 31 Sales n 32 Foundation %<----- n Jones 33 Engineering n Steinberg 33 Engineering n Robinson 34 HR n Smith 34 HR n 35 Marketing %<----- n

全連接是左右外連接的並集. 連接表包含被連接的表的所有記錄, 如果缺少匹配的記錄, 即以默認值填充。這允許我們查看每一個在部門裡的員工和每一個擁有僱員的部門, 同時, 還能看到不在任何部門的員工以及沒有任何員工的部門

% 全連接nt5 = outerjoin(C,B,MergeKeys,true)nt5 = n LastName DepartmentID DepartmentNamen ___________ ____________ ______________nn Rafferty 31 Sales n 32 Foundation %<----- n Jones 33 Engineering n Steinberg 33 Engineering n Robinson 34 HR n Smith 34 HR n 35 Marketing %<----- n Jasper 36 %<----- n

內連接(inner join)是應用程序中用的普遍的"連接"操作,它一般都是默認連接類型。內連接基於連接謂詞,即DepartmentID,將兩張表的列組合在一起,產生新的結果表。查詢會將 A 表的每一行和 B 表的每一行進行比較,並找出滿足連接謂詞的組合

% 內連接n>> t5 = innerjoin(C,B)nt5 = n LastName DepartmentID DepartmentNamen ___________ ____________ ______________nn Rafferty 31 Sales n Jones 33 Engineering n Steinberg 33 Engineering n Robinson 34 HR n Smith 34 HR n

t1和t5的結果類似,join和innerjoin的區別在於join對兩個表的契合度要求更高,表1中的Key一定要在表2中也出現,如果嘗試連接表3和表2,因為表C的Jasper的DepartmentID變成了36,而36在表2中不存在,MATLAB報錯如下:

% join報錯n>> join(C,B)nError using table/join (line 130)nThe key variable for B must contain all values in the key variable for A. n>> [a b] = lasterrna =nError using table/join (line 130)nThe key variable for B must contain all values in the key variable for A.nb =nMATLAB:table:join:LeftKeyValueNotFound n

table的屬性和支持的操作

最後做個總結,table是MATLAB從R2013b開始新引入的一個類(數據類型)。用UML(Unified Modeling Language)中的類圖,可以表示如圖 Figure.1

Figure.1 table的Class Diagram

圖Figure.1中的屬性除Properties外都是私有屬性,即不可以用dot語法直接訪問

% 通過Properties這個中間屬性來訪問table的其它屬性n>> t1.VariableNamesnYou can not access the VariableNames property directly. Access it using dot subscripting via .Properties.VariableNames.n

按照錯誤信息的提示,我們可以通過Properties這個metadata來訪問這些屬性,表ref{map_phone_book_table}對應的table中的Properties將返回如下的內容

% Properties作為訪問table其它屬性的中間層n>> t1.Propertiesnans = n Description: n VariableDescriptions: {}n VariableUnits: {}n DimensionNames: {Row Variable}n UserData: []n RowNames: {}n VariableNames: {Name Number}n>> t1.Properties.VariableNamesnans = n Name Number n

圖Figure.1中的中Import and export,Size and Shape, set, Data Organization操作代表一些列可以施加在table上的方法的集合。我們可以通過help命令來得到該類的幫助信息:

>> help tablen

其中有這些方法的介紹,這裡大致羅列如下,方便讀者查閱。

  • Import and export類的操作
    • eadtable 讀入一個文件,創建table對象
    • writetable 普通函數,把table寫入一個文件,內部調用write
    • write 類方法,把table寫入一個文件
  • Size and shape類的操作
    • istable 判斷一個變數是否是table類型
    • size 返回table的高和寬,表頭不計
    • width 返回table的寬
    • height 返回table的高
    • ndims 返回table的維度
    • numel 返回table高和寬的乘積
    • horcat 橫向串接table
    • vercat 縱向串接table
  • Set membership類的操作
    • intersect 返回兩表中的相同的行
    • ismember 查詢表中的行是否在另一表中也出現
    • setdiff 查詢兩表之間的差異
    • unique 返回的表中沒有相同的行
    • sextor 兩個集合交集的非
    • union 兩個集合的並
    • join 自然連接
    • innterjoin 內連接
    • outerjoin 外連接
  • Data organization的操作
    • summary 返回table的基本信息
    • sortrows 給table按照制定的row排序
    • stack 把table的各列摞成一列
    • unstack 把table的某一列展開成為若干列
    • ismissing 找到table中那些沒有賦值的項,返回logical index
    • standizeMissing 給未賦值項賦默認值
  • varfun 把函數作用在table中選定的變數上
  • rowfun 把函數作用在table的每列上

推薦閱讀:

Matlab2012a(32/64位)
MATLAB神經網路(四):基於Adaboost的強分類器設計
MATLAB和物聯網連載6: Thingspeak Tutorial 5
淺談線性化

TAG:MATLAB | 面向对象编程 | 面向对象分析与设计 |