這是R數(shù)據(jù)科學(xué)的讀書筆記之一,《R數(shù)據(jù)科學(xué)》是一本教你如何用R語言進(jìn)行數(shù)據(jù)分析的書。即便我使用R語言快2年多了,但是讀這本書還是受益頗多。
最早接觸R語言的時(shí)候看的是《R語言實(shí)戰(zhàn)》, 在第二章里,該書將R語言的數(shù)據(jù)結(jié)構(gòu)分為6種,向量、矩陣、數(shù)組、數(shù)據(jù)框、因子和列表。當(dāng)時(shí)的理解是,矩陣是二維的向量,數(shù)組是二維以上的向量,數(shù)據(jù)框是特殊性質(zhì)的列表。 但是讀完《R數(shù)據(jù)科學(xué)》的第15章:向量后,我發(fā)現(xiàn)原來R語言的數(shù)據(jù)結(jié)構(gòu)原來可以只分為兩類 原子向量和遞歸向量的 唯一區(qū)別 就在于其中存放的值是否都是同種類型。 向量(vector), 矩陣(matrix)和數(shù)組(array)以及因子(factor)都只能存放一種數(shù)據(jù)類型,因此 is.atomic 的判斷結(jié)果都是TRUE, 所以都是原子向量 數(shù)據(jù)庫和列表可以包含不同類型的數(shù)據(jù),所以用 is.recursive 的判斷結(jié)果是TRUE,所以都是遞歸向量
此外,每個(gè)向量都有兩個(gè)關(guān)鍵屬性(properties),類型和長度, 分別用 typeof() 和 length() 進(jìn)行查看。分別去用 typeof() 查看向量、矩陣、數(shù)組、因子、數(shù)據(jù)框和列表時(shí),你會(huì)發(fā)現(xiàn)前面4個(gè)返回都是6種基本數(shù)據(jù)類型,而數(shù)據(jù)框和列表返回的都是'list'. 我們還可以在向量上附加任意多的元數(shù)據(jù)(metadata),這些元數(shù)據(jù)稱之為特征(attributes)。 附加不同的特性后就得到了擴(kuò)展向量(augmented vectors), 其中名稱、維度和類是三種特別重要的屬性。 如果你去查看attribute和property的中文翻譯時(shí),你會(huì)發(fā)現(xiàn)兩者都有一個(gè)釋義叫做屬性
從擴(kuò)展向量的角度上看數(shù)據(jù)類型時(shí),可以得到如下洞見 第一: 矩陣和數(shù)組相對(duì)于普通向量主要就多了一個(gè) dim 屬性,所以我們可以通過如下的操作來創(chuàng)建矩陣和數(shù)組 is.v.m.a <> function(x) {c(is.vector(x), is.matrix(x), is.array(x))}
v <> c(1,2,3,4)
is.v.m.a(v) # TRUE FALSE FALSE
attr(v,'dim') <> c(2,2)
is.v.m.a(v) # FALSE TRUE TRUE
attr(v,'dim') <> c(1,2,2)
is.v.m.a(v) # FALSE FALSE TRUE
注: 矩陣是特殊的數(shù)組。 第二:名稱是一種額外屬性, 對(duì)于向量是'names', 對(duì)于數(shù)組則是'dimnames[[x]]', x表示不同維度, 對(duì)于列表而言則是'names',對(duì)于數(shù)據(jù)框是'names'對(duì)于列名和'row.names'對(duì)于行名 v <> c(1,2,3,4)
attr(v,'names') <> c('a','b','c','d')
第三:類(class)也是一種屬性,類是面向?qū)ο缶幊痰囊粋€(gè)概念。在R語言中,我們會(huì)發(fā)現(xiàn)同一個(gè)函數(shù)居然可以用在不同的數(shù)據(jù)集,比如說 print 用在ggplot2的對(duì)象中,結(jié)果是輸出圖片,這種函數(shù)就稱之為泛型函數(shù)。 methods(print)# 內(nèi)容過多,不在這里展示
# 我們可以具體某個(gè)函數(shù)的代碼
getS3method('print','data.frame')
關(guān)于泛型函數(shù)的更多知識(shí)會(huì)在后續(xù)的面向?qū)ο缶幊汤锝榻B。 其他知識(shí)點(diǎn)R語言的缺失值一般都標(biāo)記為'NA', 因此在讀取數(shù)據(jù)的時(shí)候默認(rèn)也將文件中的'NA'當(dāng)作缺失值,但是很有可能其他人會(huì)用'null'作為缺失值的標(biāo)記,所以結(jié)果就會(huì)導(dǎo)致這一列全部被當(dāng)做是字符串,影響后續(xù)的分析。 在向量取子集時(shí),熟悉Python的人需要注意一點(diǎn),Python中 x=[1,2,3,4];x[-1] 表示選擇最后一個(gè)元素,而在R語言里 x=c(1,2,3,4);x[-1] 表示刪除第一個(gè)元素,即R用負(fù)整數(shù)取子集時(shí)會(huì)丟棄對(duì)應(yīng)位置的元素。 [ 和 [[ 在提取列表時(shí),一定要注意, [[ 會(huì)使列表降低一個(gè)層次,而 [ 會(huì)返回一個(gè)新的、更小的列表,也就是
l <> list(c(1,2,3))
l[1] # 返回列表
l[[1]] # 返回向量
為了更好理解這兩者在列表中的差異,作者還提供了一個(gè)非常形象的例子,我用另一個(gè)例子來說明下: 我所就讀的初中每個(gè)年級(jí)段大概有10個(gè)班級(jí),每個(gè)班級(jí)的人數(shù)都不太一樣。那么這里的一個(gè)年級(jí)段就是一個(gè)列表 x ,每個(gè)班級(jí)都是列表里元素。那么 x[1] 表示的是解散其他所有班級(jí),只留下第一個(gè)班級(jí)組成年級(jí)段。而 x[[1]] 表示是第一個(gè)班級(jí)。 x[[1]][1] 表示的可能是第一個(gè)班級(jí)里的第一個(gè)學(xué)生。 查看列表結(jié)構(gòu)的最好方式是用函數(shù)str
|