- R語言數據可視化:科技圖表繪制
- 芯智 龍勝編著
- 4029字
- 2024-12-31 20:29:39
1.4 數據結構

在R中分析數據或創建圖形時,首先要提供參與分析或繪圖的數據集(Data Set)。R可以處理的數據集類型包括向量(Vector)、矩陣(Matrix)、數組(Array)、數據框(Data Frame)、因子(Factor)、列表(List)等,它們的數據結構如圖1-11所示。

圖1-11 輸出結果
1.4.1 數據類型
在R中,常見的數據類型有數值型(Numeric)、字符型(Character)、邏輯型(Logical)、復數型(Complex)或日期時間型(Data)等,其中數值型又分為整數型(Integer)和雙精度型(Double)兩種。數據類型的識別、判斷以及類型之間的轉換是數據分析中必不可少的內容。
在統計分析或運算過程中,可能需要對向量中的數據類型進行識別和判斷。R中使用class()函數識別數據類型,使用is.*()函數判斷是否為某個指定的數據類型,使用as.*()函數進行數據類型的轉換。其中*為數據類型的英文表示。
另外,R語言中還包含幾種常見的特殊值,如表1-1所示。
表1-1 特殊的數據類型

【例1-7】數據類型應用示例。
輸入代碼如下:

1.4.2 向量
向量是R語言中重要的數據結構,可以是數值數據、字符數據或邏輯值,很多情況下都會涉及向量的處理和運算。向量的創建可以通過手動輸入、序列生成、重復生成和目標抽取(向量索引)等方法實現。
1.手動輸入法
R語言允許用戶通過手動方式將數據存儲到向量中,例如將姓名存儲到變量為Name的向量中,或將性別存儲到變量為Gender的向量中。手動構建向量通過c()函數實現。
【例1-8】手動輸入向量示例。將3個客戶的姓名、性別、出生日期和收入保存到各自的變量中。
輸入代碼如下:
> Name <- c('Jeff','Tom','Mary') > Gender <- c('男','男','女') > Birthday <- c('1985-6-18','1992-4-11','1986-12-8') > Income <- c(16000,8500,12500)
說明(1)代碼中的“ <- ”符號表示賦值,即將符號右邊的向量賦值給左邊的變量,表示賦值的符號還可以使用“=”“->”,讀者根據自己的習慣選擇即可。
(2)對于字符型的值或日期時間型的值,必須用引號引起來(如前3個變量),而數值型的值則不需要。
2.序列生成法
利用符號“:”或函數seq()生成具有規律的數值型數據,這就是序列生成法。其中,英文狀態下的冒號“:”用于生成步長為1或-1的連續數據,seq()函數用于生成指定步長或長度的等差數列。seq()函數的語法格式為:

其中,from指定等差數列的初始值;to指定等差數列的結束值;by指定等差數列的公差;length表示在公差未知的情況下,可以通過其設定等差數列的元素個數。
【例1-9】序列生成法輸入向量示例。
輸入代碼如下:

3.重復生成法
重復生成法是利用rep()函數將某個對象進行指定次數的重復,進而減少人工輸入的一種方法。rep()函數的語法格式為:
rep(x,times) rep(x,each)
其中,x指定需要循環的對象,times指定x的循環次數(x的整體在循環),each指定x中元素的循環次數(依次將x的元素進行循環)。
【例1-10】通過重復生成法錄入公司2020—2022年各季度的銷售額。
輸入代碼如下:

創建的數據框對象如圖1-12所示,讀者應觀察Year、Quarter兩個向量創建的差異。

圖1-12 創建數據框對象
4.目標抽取法(向量索引)
在介紹目標抽取前,先介紹一下向量索引。向量中的元素是按照順序排列的,通過索引的方法可以將向量中的元素提取出來。在R語言中,索引使用方括號“[]”表示,包括位置索引與bool索引兩種方法。
(1)位置索引是指在中括號內標明目標元素的下標,如向量第5個元素可以寫為“[5]”,當取出向量中的多個元素時,需要將整數型的下標值寫成向量的形式,如向量的第2、4、6個元素可以寫為“[c(2,4,6)]”。
(2)bool索引是指方括號“[]”內的值不是整數型下標,而是TRUE或FALSE,索引時取出TRUE所對應的值。bool索引經常會與比較運算符(>、>=、<、<=、==、!=)配合使用,相比于位置索引,bool索引使用得更加頻繁。
回到目標抽取法,它是指從已知向量中提取子集(由該向量的部分元素組成新的向量),或從矩陣中抽取一行或一列,或從數據框中抽取一列,進而得到數值型、字符型或日期時間型的向量。
矩陣或數據框的操作將在后文介紹。向量子集的提取通過方括號來實現,具體方式如下:
(1)通過在中括號中指定正整數來返回向量指定位置的元素組成的子向量(R語言中向量的元素起始位置為1)。
(2)通過在方括號中指定邏輯值向量來返回向量中對應的邏輯值為TRUE的元素組成的子向量。
(3)通過在方括號中指定負整數來返回向量除去指定位置的元素組成的子向量。方括號內不能同時包含正整數和負整數。
(4)如果向量已經命名,則可以通過在方括號中指定元素的名稱來返回相應的子向量。
【例1-11】向量子集的提取示例。
輸入代碼如下:

1.4.3 矩陣與數組
前面介紹的向量實際上就是一個一維數組。而矩陣是一個二維數組,其中的每個元素都是相同的數據類型。
1.創建矩陣和數組
在R中,用matrix()函數可以創建矩陣,其語法格式為:
matrix(data=NA,nrow=l,ncol=l,byrow=FALSE,dimnames=NULL)
其中,data指定一個用于構造矩陣的一維向量;nrow指定矩陣的行數(默認為1);ncol指定矩陣的列數(默認為1);byrow為布爾型的參數,指在矩陣構造過程中元素是按列填充(byrow=FALSE)還是按行填充(byrow=TRUE);dimnames用于設置矩陣的行和列的名稱,需將行、列名稱以列表的形式傳遞給該參數。
數組與矩陣類似,但數組的維數可以大于2。在R中,使用array()函數創建數組,其語法格式為:
array(data=NA,dim=length(data),dimnames=NULL)
其中,data是一個包含數組中數據的向量;dim指定每個維度的最大長度;dimnames是各維度名稱標簽的一個列表。
另外,在R中通過as.matrix()函數可以將數據框強制轉換為矩陣,其語法格式為:
as.matrix(x,rownames.force=NA)
其中,x指定一個數據框,并將其強制轉換為矩陣;rownames.force為布爾型參數,將x強制轉換為矩陣后,矩陣是否包含字符型的列名稱,默認為NA,表示矩陣列名稱與數據框變量名稱一致。
使用t()函數可以實現矩陣的轉置,其語法格式為:

【例1-12】創建矩陣與數組示例。
輸入代碼如下:

2.提取子集(矩陣索引)
矩陣子集的抽?。ㄋ饕┡c向量子集的抽取(索引)相似,不同的是向量子集是基于一維數據提取的,而矩陣子集則是基于二維數據提取的。
矩陣子集的提取方法為[row_index,col_index],其中row_index控制矩陣提取的行,col_index控制矩陣要取的列。
【例1-13】矩陣子集的提取示例。
輸入代碼如下:

提示取出矩陣中的單行或單列時,應的col_index或row_index不需要設置。其中dim函數以向量形式返回矩陣的行數和列數,dim(Mat)[1]表示僅返回矩陣Mat的行數。
1.4.4 數據框
數據框即數據表,表中不同的字段可以是不同的數據類型,因此構成數據框的各字段可以是不同數據類型的向量。而向量和矩陣的元素不允許同時出現多種數據類型。
構造數據框可以利用data.frame()函數手動創建,或者利用as.data.frame()函數將矩陣或列表強制轉換為數據框,也可以通過讀取外部數據形成數據框。
函數data.frame()的語法格式為:

stringsAsFactors())
部分參數的含義如表1-2所示。
表1-2 參數含義

函數as.data.frame()的語法格式為:
as.data.frame(x,row.names=NULL)
其中,x指定待轉換為數據框的對象,可以是列表或矩陣。
【例1-14】數據框創建示例——手動構造學生信息的向量。
輸入代碼如下:

創建的數據框對象如圖1-13所示。通過data.frame()函數方便將6個向量組合為一張數據表,并且表中的字段包含字符型、數值型和日期型。

圖1-13 創建數據框對象
注意組合為數據框的向量元素個數必須相等,否則會返回錯誤信息。
當數據框中的行和列較多時,使用head()函數可以只顯示數據框的前幾行,使用tail()函數可以只顯示數據框的后幾行。

當數據量比較大時,使用str()函數可以只查看數據的結構。如查看數據框Stu_info的數據結構,可使用下面的代碼:

結果顯示,Stu_info是一個數據框,共有6個變量,每個變量又有6個觀測值。
另外,還有其他函數可以查看數據框的類型、行數、列數等其他信息。

當需要對數據框中的特定變量進行分析或繪圖時,使用“$”符號指定要分析的變量。

使用rbind()函數可以將不同的數據框按行合并,使用cbind()函數可以將不同的數據框按列合并。為保證有意義地合并,當按行合并時,數據框中的列變量必須相同;當按列合并時,數據框中的行變量必須相同。
1.4.5 列表
列表用以存儲包括常數、向量、矩陣、數據框在內的任意一種數據對象,甚至可以嵌套列表。列表的元素可以是異質的,行數也可以不同。
1.構造列表
列表的構造使用list()函數,其語法格式為:
list(…)
其中,…為常數、向量、矩陣、數據框在內的任意一種數據對象。
【例1-15】創建包含常數、字符型向量、矩陣和數據框4個元素的列表。
輸入代碼如下:

說明在構造列表時,第3個元素并沒有將Mat傳遞給一個新的變量名,因此第3個元素的輸出以“[[3]]”作為名稱。
2.列表索引
列表的索引有單方括號“[]”、雙方括號“[[]]”和美元符號“$”3種形式,區別在于返回的元素是列表型數據結構還是其本身的數據結構。
單括號索引方式返回的一定是列表型對象,而非元素的原始結構;雙括號索引或美元符號索引方式返回的一定是元素的原始結構。
【例1-16】利用上例中創建的列表List_object演示列表的索引,檢查返回列表中元素的數據結構。
輸入代碼如下:

如結果所示,第一個元素通過單中括號的索引方式返回列表型對象,第二個元素通過雙中括號的索引方式返回字符型向量,第三個元素通過雙中括號的索引方式返回矩陣型對象,第四個元素通過美元符號索引方式返回數據框對象。
注意在返回原始的數據結構時,若列表元素有名稱(如List_object中的A、B和D),則可以使用雙括號或美元符號;若列表元素沒有名稱(如List_object中的[[2]]),則只能使用雙括號的索引方式。
1.4.6 因子
在數據分析中,變量或數據(變量的觀測結果)基本可以分為類別變量(Categorical Variable)與數值變量(Metric Variable)兩大類。
(1)類別變量是取值為對象屬性或類別以及區間值(Interval Value)的變量,也稱定性變量(Qualitative Variable)。例如性別可以分為“男”“女”兩類,“性別”就是類別變量,當把成績(滿分100分)等級分為85~100(優)、75~84(良)、60~74(中)及60以下(差),“成績等級”為數值區間,因而也屬于類別變量,類別變量的觀測值就是類別數據。
類別變量根據取值是否有序可分為無序類別變量和有序類別變量。無序類別變量的各類別間是不可以排序的,而有序類別變量的各類別間是有序的,如成績分為“優”“良”“中”“差”就是有序的。取區間值的變量自然是有序類別變量。
(2)數值變量是取值為數字的變量,變量的觀測結果稱為數值數據(Metric Data)或定量數據(Quantitative Data)。數值變量根據其取值的不同可以分為離散變量和連續變量。離散變量是只能取有限個值的變量,其取值可以列舉;連續變量是可以在一個或多個區間中取任何值的變量。
類別變量在R中稱為因子(Factor),因子的取值稱為水平(LEVEL),很多分析或繪圖都可以按照因子的水平進行分類處理。使用factor()函數可以將向量編碼為因子。
【例1-17】將向量編碼為因子示例。
輸入代碼如下:

可以發現,上述因子是無序的。若將有序因子轉換為數值,則需要將factor()函數中的參數設置為ordered=TRUE(默認ordered=FALSE)。

- 數據庫程序員面試筆試真題與解析
- 微信公眾平臺與小程序開發:從零搭建整套系統
- 劍指JVM:虛擬機實踐與性能調優
- Access 數據庫應用教程
- Xcode 7 Essentials(Second Edition)
- Mastering PHP Design Patterns
- 老“碼”識途
- 深入淺出DPDK
- Learning Network Forensics
- Spring Boot企業級項目開發實戰
- jQuery Mobile移動應用開發實戰(第3版)
- Visual Studio Code 權威指南
- Robot Framework Test Automation
- Microsoft HoloLens By Example
- Developer,Advocate!