【R語言基礎】02. 基本數據結構
一、基本數據類型
包括數值型(numeric)、邏輯型(logical)、字元型(character)、缺失值(NA)、浮點型(double)、複數型(complex)、整數型(integer)等。
數據類型的判別與轉換都是統一的格式,例如,is.numeric()判斷是否為數值型,as.numeric()轉換為數值型。
查看對象的類型,用函數class()/typeof()/mode(),基本格式相同:
class(x)
其中,x為要查看的對象。
注:在展現數據的細節上,mode()<class()<typeof();str(x)顯示對象x的結構
二、數據結構
1. 向量
向量是R語言中最基本的數據類型,是以一維數組管理數據的一種對象類型,可以是數值型、字元型、邏輯值型、複數型。
注意:同一向量不能混雜多種不同類型的數據。
(1) n創建向量
通過函數c()實現組合功能,例如
x1<-c(2,3,5,7,10)nx1n[1] 2 3 5 7 10nx2<-c("a","b","c")nx2n[1] "a" "b" "c"n
(2) 向量索引
下標索引:(R語言中下標是從1開始的),例如
x[1]——返回x的第1個元素
x[-1]——返回除第一個元素之外的所有元素
x[2:4]——返回x的第2至4個元素
x[-(2:4)]——返回x的除第2至4元素之外的所有元素(刪除元素)
名稱索引:先給向量中的每個元素命名,再通過名稱訪問對應的元素。
which元素位置:通過函數which()返回邏輯向量中為TRUE的位置(下標);which.max(x), which.min(x)返迴向量x中最大值、最小值所在的位置。
x1[which(x1>3 & x1<8)] #返回滿足條件的元素n
subset生成子集:檢索向量中滿足條件的元素,提取出來:
subset(x1,x1>3 & x1<8) #結果同上n
match匹配:match(x1,x2) 逐個檢查向量x1中元素是否在向量x2中,若是則返回該元素,否則返回NA。
%in%檢查是否屬於:x1 %in% x2 逐個判斷向量x1中元素是否屬於向量x2。
(3)向量的編輯
對已創建向量進行增加或刪除元素。
x<-c(x1,c(6,7,8)) #增加一個向量n
x[10]=10 #增加第10個元素,前面空位置用NA補齊n
x<-x[-c(3,5)] #刪除第3和第5個元素
(4)創建等差序列
函數seq(),基本格式為:
seq(from=1,to=...,by=...,length.out=...,along.withn=...)
其中,from, to設置首項、尾項;
by設置等差值(默認為1或-1);
length.out設置序列長度;
along.with以該參數的長度作為序列長度。
(5)創建重複序列
函數rep(),基本格式為:
rep(x,times=...,each=1,length.out=...)
其中,x為要重複的序列;
times設置序列重複次數;
each設置每個元素分別重複的次數;
length.out設置產生的序列的長度;
2. 矩陣
矩陣是二維數組,可以描述二維數據,也要求矩陣內各元素有相同的類型。
(1)創建矩陣
函數matrix(),基本格式為:
matrix(x, nrow=..., ncol=..., byrow=FALSE,ndimnames=...)
其中,x為數據向量作為矩陣的元素;
nrow設定行數;
ncol設定列數;
byrow設置是否按行填充,默認為FALSE按列填充;
dimnames用字元型向量表示矩陣的行名和列名。
(2)矩陣索引
a[i,j]——返回矩陣a的第i行,第j列的元素n
c["r2","c1"]——返回矩陣c的名稱為「r2」的行,「c1」的列對應的元素n
a[i,]——返回矩陣a的第i行n
a[,j]——返回矩陣a的第j列n
a[c(i:j),]——返回矩陣a的第i至第j行
dim(x)——返回矩陣x的維數(幾行×幾列)
(3)矩陣的編輯
函數rbind(A,B), 縱向合併(增加行),要求列數相同;
函數cbind(C,D), 橫向合併(增加列),要求行數相同。
注意:rbind(A,1)相當於給矩陣A增加一行「1」。
a[-1,]——刪除矩陣a的第1行
a[,-1]——刪除矩陣a的第1列
a[-c(2:4),]——刪除矩陣a的第2至4行
(4) 矩陣簡單操作
nrow(A),ncol(A)——矩陣A的行數、列數;
dim(A)——矩陣A的維數;
rowSums(A), rowMeans(A), colSums(A), colMeans(A)——按行按列求和、求均值;
t(A)——A轉置
3. 數據框(數據表)
R語言中做統計分析的樣本數據,都是按數據框類型操作的。數據框的每一列代表一個變數屬性的所有取值,每一行代表一條樣本數據。
(1) 創建數據框
通過函數data.frame()把多個向量組合起來創建,並設置列名稱。其基本格式為:
data.frame(col1=,col2=,col3=,...)
其中,col1, col2, col3, …為列名,其賦值向量可以為任意類型。
nnnnnnnnnnnn註:矩陣也可以通過函數data.frame()轉化為資料庫。
iris<-data.frame(Sepal.Length=c(5.1,4.9,4.7,4.6), nSepal.Width=c(3.5,3.0,3.2,3.1), nPetal.Length=c(1.4,1.4,1.3,1.5), nPetal.Width=rep(0.2,4))nirisn Sepal.Length Sepal.Width Petal.Length Petal.Widthn1 5.1 3.5 1.4 0.2n2 4.9 3.0 1.4 0.2n3 4.7 3.2 1.3 0.2n4 4.6 3.1 1.5 0.2n
(2) 數據框索引
列標或列名稱索引:
iris[,1], iris$Sepal.Length, iris["Sepal.Length"]
——都是返回數據框iris的第1列;n
行索引:
iris[1,]——返回數據框iris的第1行
iris[1:3,]——返回數據框iris的第1至3行
元素索引:
iris[1,1]或iris$Sepal.Length[1]n或iris["Sepal.Length"][1]
——都是返回數據框iris的第1列第1個數據
用函數subset()按條件索引:subset(data_iris,Sepal.Length<5)
(3) 數據框的編輯
類似矩陣操作,可通過函數rbind(),增加行(樣本數據),要求寬度(列數)相同;函數cbind(),增加列(變數),要求高度(行數)相同。
刪除樣本(行),類似矩陣操作。
用函數names()查看或修改數據框的列名。
4. 因子
變數分為名義型(無順序好壞之分的分類變數,如性別)、有序型(有順序好壞之分的分類變數,如療效)、連續型(通常的數值變數,可帶小數位)。
名義型和有序型的類別變數,在R語言中稱為因子。
因子提供了一個簡單且緊湊的形式來處理分類數據,因子用水平來表示所有可能的取值,例如,性別有兩個水平:男、女。
(1) 創建因子
使用函數factor(),基本格式為:
factor(x, levels, labels=..., exclude=...,
ordered=TRUE, nmax=...)
其中,x為創建因子的數據向量;
levels指定因子的水平數,默認為x中不重複的所有值;
labels設置各水平名稱(前綴),與水平一一對應;
exclude指定有哪些水平是不需要的;
ordered設置是否對因子水平排序,默認為TRUE有序因子;
nmax設定水平數的上限。
ff<-factor(substring("statistics",1:10,1:10),levels=letters) nffn [1] s t a t i s t i c snLevels: a b c d e f g h i j k l m n o p q r s t u v w x y znff[,drop=TRUE] #去掉未包含在向量中的水平,同f.<-factor(ff)n [1] s t a t i s t i c snLevels: a c i s tnfactor(1:5,labels="let")n [1] let1 let2 let3 let4 let5nLevels: let1 let2 let3 let4 let5nfactor(LETTERS[3:1],ordered = TRUE)n[1] C B AnLevels: A < B < Cn
注:函數substring()用來提取字元串的子串,第2個參數是起始位置,第3個參數是終止位置;letters和LETTERS是R中專有變數,表示26個小寫/大寫字母組成的字元向量。
也可以用函數gl()生成不同水平的因子序列,基本格式為:
gl(n, k, length=, labels=, ordered=FALSE)n
其中,n表示因子水平數;
k表示每個水平的重複數;
length表示生成序列的長度,默認n×k;
labels為表示因子水平的向量,默認1:n;
ordered指定是否為有序因子,默認FALSE無序因子。
gl(3,2,ordered = TRUE) #生成水平數為3,每個水平重複2次的有序因子序列n[1] 1 1 2 2 3 3nLevels: 1 < 2 < 3n
註:R語言中,因子是以整數型向量存儲的,每個因子水平對應一個整數型的數。對字元型向量創建的因子,會按照字母順序排序,再對應到整數型向量。
5. 列表
列表就是一些對象或成分的有序集合(組合方式更自由)。列表允許整合若干對象到單個對象名下,例如,某個列表可能是若干向量、矩陣、數據框,甚至是其它列表的組合。
列表常用來存儲較複雜的數據對象。列表提供了一種簡單的方式來組織和訪用不相干的對象。另外,R語言中許多函數的運行結果都是用列表形式返回的。
(1) 創建列表
用函數list(),基本格式為:
list(name1=object1,name2=object2,...)
其中,object對象可以是任何類型。
data<-list(a=c(1,2,3,4),b=c("one","two","three"),c=c(TRUE,FALSE),d=(1+2i))ndatan$an[1] 1 2 3 4n$bn[1] "one" "two" "three"n$cn[1] TRUE FALSEn$dn[1] 1+2in
(2) 列表索引
與數據框操作類似,但是用雙重方括弧。
data[[1]]或data[["a"]]——返回列表data的第1列
data$a——返回列表data的名稱為a的列
data[[1]][1]——返回列表data的第1列的第1個元素
(3) 列表的編輯
與向量的編輯類似,使用函數c()進行合併。
主要參考文獻
- 張良均,謝佳標,楊坦,肖剛. R語言與數據挖掘. 機械工業出版社,2016.
作者:張敬信
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。推薦閱讀:
※翻譯:用R語言進行數據清洗
※如何在Quora上獲得更多的贊——來自10393個回答的實證
※R語言可視化——圖表美化與套用主題(上)
※[譯]快速上手:在R中使用XGBoost演算法