附代碼 |詳解R語(yǔ)言的高級(jí)數(shù)據(jù)結(jié)構(gòu)
(給機(jī)器學(xué)習(xí)算法與Python實(shí)戰(zhàn)加星標(biāo),提升AI技能)

有時(shí)數(shù)據(jù)需要比向量更復(fù)雜的存儲(chǔ)方式。幸運(yùn)的是,R軟件提供了很多的數(shù)據(jù)結(jié)構(gòu)。常見(jiàn)的有數(shù)據(jù)框(data.frame)、矩陣(matrix)、列表(list)以及數(shù)組(array)。數(shù)據(jù)框類似于電子表格,矩陣類似于人們熟悉的矩陣數(shù)學(xué)計(jì)算,列表對(duì)于程序員比較熟悉。
?

數(shù)據(jù)框是R語(yǔ)言中最有用的功能之一,它也是R語(yǔ)言的易用性經(jīng)常被提及的原因之一。直觀上,數(shù)據(jù)框就像Excel電子表格一樣有列和行。在統(tǒng)計(jì)上,每列代表一個(gè)變量,每行代表一個(gè)觀測(cè)。
?
在數(shù)據(jù)框中,每列實(shí)際是個(gè)向量,都有相同的長(zhǎng)度。數(shù)據(jù)框可以用來(lái)保存不同數(shù)據(jù)類型的數(shù)據(jù)。這也暗示著,每列的每個(gè)元素必須是相同數(shù)據(jù)類型的,類似向量的要求。創(chuàng)建數(shù)據(jù)框有很多種方式,最簡(jiǎn)單的是用data.frame函數(shù)。這里用前面介紹過(guò)的向量x、y、q創(chuàng)建一個(gè)基本的數(shù)據(jù)框。


這里創(chuàng)建了一個(gè)由3個(gè)向量組成的10行3列的數(shù)據(jù)框。注意theDF的名字也是變量。實(shí)際上,可以在創(chuàng)建數(shù)據(jù)框的過(guò)程中設(shè)置變量名字。

數(shù)據(jù)框是具有很多屬性的復(fù)雜對(duì)象。最常檢查的屬性是行數(shù)和列數(shù),用nrow和ncol函數(shù)分別得到數(shù)據(jù)框的行數(shù)和列數(shù),而dim函數(shù)可以同時(shí)得到數(shù)據(jù)框的行數(shù)和列數(shù)。
?

數(shù)據(jù)框的列名字用names函數(shù)獲取。names函數(shù)返回一個(gè)字符向量,列出所有的列名。由于是向量,可以訪問(wèn)它的每一個(gè)元素。
?

也可以獲取和指定數(shù)據(jù)框的行名字。
?


有時(shí)一個(gè)數(shù)據(jù)框有太多的行,以至于不能在屏幕上全部顯示出來(lái),這時(shí),可以用head函數(shù)顯示出前幾行。

像其他變量一樣,用class函數(shù)獲取數(shù)據(jù)框所屬的類。
?

列表框的每列是獨(dú)立的向量,因此,每列都有它自己的類,可以單獨(dú)被訪問(wèn)。R語(yǔ)言有多種方法來(lái)訪問(wèn)每個(gè)列,比如操作符和方括號(hào)。theDF$Sport得到theDF的第三列,這說(shuō)明允許通過(guò)列名來(lái)指定特定的列。


與向量相似,數(shù)據(jù)框允許使用方括號(hào)通過(guò)位置訪問(wèn)單個(gè)元素,但是要用兩個(gè)位置指定,而不是向量中的一個(gè)位置。第一個(gè)是行數(shù),第二個(gè)是列數(shù)。用theDF[3,2]可以得到theDF的位于第三行第二列的元素。
?

可以用向量來(lái)索引更多的行或者列。

通過(guò)指定行而不指定任何列可以訪問(wèn)一整行。同樣,可以指定列而不指定任何行來(lái)訪問(wèn)一整列。
?


將列參數(shù)指定為字符向量可以以列名訪問(wèn)多列。

訪問(wèn)指定列的另外一種方式是把列的名字(索引數(shù))作為方括號(hào)里的第二個(gè)參數(shù),或者作為單方括號(hào)或雙方括號(hào)里的唯一參數(shù)。
?


這些方法的輸出不盡相同。有些返回一個(gè)向量,有些返回一個(gè)單列的數(shù)據(jù)框。為了確保輸出單列的數(shù)據(jù)框,使用單方括號(hào),同時(shí)指定第三個(gè)參數(shù):drop=FALSE。通過(guò)列索引數(shù)指定某列也同樣適用。
?

factor的特殊存儲(chǔ)形式也可以表示成數(shù)據(jù)框的形式,為此用model.matrix創(chuàng)建一個(gè)指示變量(或啞變量)的集合。列代表factor的水平值,每行里,對(duì)應(yīng)水平值的那行為1,其他為0。
?

?
?

R語(yǔ)言的列表是一個(gè)容器,可以存儲(chǔ)相同類型或者不同類型的數(shù)據(jù)。列表可以存儲(chǔ)任意數(shù)量、任意類型的對(duì)象。列表可以全部包含數(shù)值型或者字符型數(shù)據(jù),也可以包含兩種數(shù)據(jù)類型的混合,以及數(shù)據(jù)框或者其他列表。
列表用list函數(shù)創(chuàng)建,函數(shù)的參數(shù)即為列表的元素。
?




注意,前面創(chuàng)建列表list3的代碼塊被括號(hào)整個(gè)括起來(lái),使得執(zhí)行的結(jié)果被打印出來(lái)。
像數(shù)據(jù)框一樣,列表也可以有名字。列表中每個(gè)元素都有唯一的名字,可以使用names函數(shù)查看或設(shè)置名字。
?

?
列表元素的名字也可以在創(chuàng)建的過(guò)程中用名字-值成對(duì)指定。
?


令人驚奇的是,可以用vector創(chuàng)建指定長(zhǎng)度的空列表。

?
用雙方括號(hào),通過(guò)設(shè)定元素編號(hào)或元素名字,可以訪問(wèn)列表的單個(gè)元素。注意這種方式一次只能訪問(wèn)一個(gè)元素。
?


如果實(shí)際使用的元素在一個(gè)被訪問(wèn)的元素中,可以通過(guò)元素的嵌套索引來(lái)訪問(wèn)。

使用索引(數(shù)字或名字)可以對(duì)列表增加元素,前提是該索引事先不存在列表中。
?


偶爾對(duì)列表或向量或數(shù)據(jù)框增加元素都還好,但是,如果反復(fù)這樣做計(jì)算代價(jià)就太高了。所以最好創(chuàng)建指定長(zhǎng)度的列表,然后通過(guò)合適的索引增加元素。
?

對(duì)統(tǒng)計(jì)非常重要的數(shù)學(xué)結(jié)構(gòu)是矩陣。矩陣跟數(shù)據(jù)框有點(diǎn)相似,是一個(gè)矩形結(jié)構(gòu),具有行和列,每列的數(shù)據(jù)類型相同,每個(gè)元素的數(shù)據(jù)類型也相同一般都是數(shù)值型。矩陣跟向量相似,也可以進(jìn)行元素與元素的加法、減法、乘法、除法、等式運(yùn)算。nrow、ncol和dim函數(shù)的使用方法與數(shù)據(jù)框的類似。
?


?
矩陣乘法是常用的數(shù)學(xué)運(yùn)算,要求左邊矩陣的列數(shù)等于右邊矩陣的行數(shù)。矩陣A和B都是5×2矩陣,所以為了能讓矩陣B放在右邊進(jìn)行矩陣乘法運(yùn)算,需要對(duì)矩陣B取轉(zhuǎn)置。
?

另外一個(gè)跟數(shù)據(jù)框相似的地方是,矩陣也有行和列的名字。
?

?
有兩個(gè)特殊的向量,letters和LETTERS,分別由小寫字母和大寫字母組成。
對(duì)矩陣取轉(zhuǎn)置進(jìn)行矩陣乘法的時(shí)候,需要注意乘積結(jié)果。轉(zhuǎn)置會(huì)置換行和列的名字。矩陣乘積的行名字取自左邊矩陣的行名字,矩陣乘積的列名字取自右邊矩陣的列名字。
?



本質(zhì)上,數(shù)組是一個(gè)多維向量,它的所有元素必須是相同類型,用方括號(hào)訪問(wèn)單個(gè)元素。方括號(hào)里第一個(gè)參數(shù)是行索引,第二個(gè)參數(shù)是列索引,剩下的參數(shù)是維度。
?

?
數(shù)組和矩陣最主要的不同是,矩陣只能是二維,而數(shù)組可以是任意維度。
數(shù)據(jù)的數(shù)據(jù)類型和結(jié)構(gòu)太多的話,會(huì)對(duì)一些分析環(huán)境帶來(lái)問(wèn)題,但是R語(yǔ)言都能從容應(yīng)對(duì)。R語(yǔ)言中最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)是一維向量。功能最強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)框(在其他語(yǔ)言中都沒(méi)有),可以像電子表格一樣處理混合數(shù)據(jù)類型。列表多用于存儲(chǔ)數(shù)據(jù)集合,有點(diǎn)像Perl中的散列表。
本文摘編于《R語(yǔ)言:實(shí)用數(shù)據(jù)分析與可視化技術(shù)》
點(diǎn)擊鏈接了解詳情并購(gòu)買
本書借鑒數(shù)據(jù)科學(xué)家Jared P Lander在R語(yǔ)言上豐富的教學(xué)經(jīng)驗(yàn),通過(guò)大量實(shí)例,詳細(xì)講解R語(yǔ)言的核心功能。對(duì)于剛接觸統(tǒng)計(jì)程序和模型的人,本書的內(nèi)容組織結(jié)構(gòu)使得學(xué)習(xí)R語(yǔ)言相當(dāng)簡(jiǎn)單和直觀。本書主要介紹R語(yǔ)言中20%的核心功能,但是這20%的功能足以讓你解決80%的現(xiàn)代數(shù)據(jù)分析。
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
玩機(jī)器學(xué)習(xí),再也不缺數(shù)據(jù)集了
用BERT奪騰訊算法大賽50萬(wàn)元大獎(jiǎng)!
集成學(xué)習(xí):一種先進(jìn)的機(jī)器學(xué)習(xí)方法
老鐵,三連支持一下,好嗎?↓↓↓
