《R語言實戰》之 創建數據集(第二章,各種數據結構)
數據集
2.1數據集概念
概念:通常是由數據構成的矩形數據
不同行業對數據集的行和列叫法不同
行業人 | 行 | 列 |
統計學家 | 觀測(observation) | 變量(variable) |
數據庫分析師 | 記錄(record) | 字段(field) |
數據挖掘和機器學習研究中 | 示例(example) | 屬性(attribute) |
可處理的數據類型(模式):數值型、字符型、邏輯型、復數型、原生型(字節)
存儲數據的結構:標量、向量、數據、數據框和列表
實例的標識符:rownames(行名);實例的類別型:因子(factors)
2.2數據結構
這節講了幾個數據結構,向量、矩陣、數組、數據框,前三種分別是一維、二維、大於二維的,它們共同點是一個數據結構中,僅能用一種數據的模式,而數據框則可以多種模式。
一些定義
對象:可復制給變量的任何事物,包括常量、數據結構、函數、圖形
模式:描述對象如何存儲和某各類
數據框:存儲數據的一種結構(列表示變量,行表示觀測),一個數據框可存儲不同類型的變量(如數值型、字符型)
2.2.1 向量(一維數據,數值型、字符型、邏輯型)
a<- c(1,2,3) #數值型 b<-c("one","two","three")#字符型 c<-c(TRUE,TURE,FALSE) #邏輯型
註意:1.字符型的向量,元素要加“ ”或者‘ ‘,數值型和邏輯型不需要。
2.同一向量,只能用一種模式的數據;
3.標量是只含一個元素的向量
#標量是 只含一個元素的向量 f<- 1 g<-"US" h<-TRUE
方括號的作用:元素的位置數值,具體如何訪問向量中的元素,看下面代碼
> a<-c("k","j","h","a","c","m") #生成一個向量 > a[3] #向量a的第三個元素 [1] "h" > a[c(1,3,5)] #向量a的第1個、第3個、第5個元素 [1] "k" "h" "c" > a[2:6] #生成一個數值序列,向量a的從第2個到第6個的元素。等價於a( [1] "j" "h" "a" "c" "m" #兩種方式生成的向量a一樣 > a<-c(2:6) > a [1] 2 3 4 5 6 > a<-c(2,3,4,5,6) > a [1] 2 3 4 5 6
2.2.2 矩陣(二維數值,字符型、數值型、邏輯型)
註意:矩陣中僅能包含一種數據類型
函數matrix()
作用:創建矩陣
格式:myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list(char_vector_rownames, char_vector_colnames))
其中,vector--矩陣的元素;nrow、ncol--分別制定行和列的維數;dimnames--可選的、以字符型向量表示的行名和列名;byrow--矩陣行行填充(byrow = TRUE)或者按列填充(byrow =FALSE),默認是按列。
matrix用法實例
eg1. 創建一個元素為1到20,大小5*4的矩陣,默認按列排列。
> y<-matrix(1:20,nrow=5,ncol=4) > y [,1] [,2] [,3] [,4] [1,] 1 6 11 16 [2,] 2 7 12 17 [3,] 3 8 13 18 [4,] 4 9 14 19 [5,] 5 10 15 20
eg2.
> cells <- c(1,26,24,68) > rnames<-c("R1","R2") > cnames<-c("C1","C2") #按列排列(也是默認方式) > mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rnames,cnames)) > mymatrix C1 C2 R1 1 24 R2 26 68 #按行排列 > mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames)) > mymatrix C1 C2 R1 1 26 R2 24 68
選擇矩陣中的元素:
X[i,]:矩陣中的第i行; X[,j]:矩陣中的第j列; X[i,j]:第i行即j列元素
選擇多行或多列,下標i和j可為數值型向量
例子:
> x<-matrix(1:10,nrow=2) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > x[2,] [1] 2 4 6 8 10 > x[,2] [1] 3 4 > x[1,4] #第1行的第4各個元素 [1] 7 > x[1,c(4,5)] #第1行的,第4個元素和第5個元素 [1] 7 9
2.2.3 數組(維度可以大於2)
註意:數組中的數據只能擁有一種模式
創建方式:array( )
myaaray <- array(vector, dimensions, dimnames)
其中,vector -- 數組的中數據;dimensions -- 數值型向量,給出各維度的最大值;dimnames -- 可選的、各維度名稱標簽的列表.
eg.創建三維(2*3*4)數值型數組
> dim1<-c("A1","A2") > dim2<-c("B1","B2") > dim2<-c("B1","B2","B3") > dim3<-c("C1","C2","C3","C4") > z<-array(1:24,c(2,3,4),list(dim1,dim2,dim3)) > z , , C1 B1 B2 B3 A1 1 3 5 A2 2 4 6 , , C2 B1 B2 B3 A1 7 9 11 A2 8 10 12 , , C3 B1 B2 B3 A1 13 15 17 A2 14 16 18 , , C4 B1 B2 B3 A1 19 21 23 A2 20 22 24 > z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3)) > z , , C1 B1 B2 B3 A1 1 3 5 A2 2 4 6 , , C2 B1 B2 B3 A1 7 9 11 A2 8 10 12 , , C3 B1 B2 B3 A1 13 15 17 A2 14 16 18 , , C4 B1 B2 B3 A1 19 21 23 A2 20 22 24
選取元素的方式與居住類似,例如:z[1,2,3]為15.
2.2.4 數據框(可包含不同模式(數值型、字符型等)的數據)
註意:可將多種模式的數據放入一個矩陣,但每列的數據模式必須唯一,不同列模式可以不同
創建函數 data.frame( )
mydata <- data.frame(col1, col2, col3)
其中,列向量col1,col2,col3可為任何類型(如字符型、數值型或邏輯型)
> patientID<-c(1,2,3,4) > age<-c(25,34,28,52) > diabetes<-c("Type1","Type2","Type1","Type2") > status<-c("Poor","Improved","Excellent","Poor") > patientdata<-data.frame(patientID,age,diabetes,status) > patientdata patientID age diabetes status 1 1 25 Type1 Poor 2 2 34 Type2 Improved 3 3 28 Type1 Excellent 4 4 52 Type2 Poor
選取數據框中的元素:1.用下標記號。2.直接指定列明。3.$:選取給定數據框的某個特定變量
> patientdata[1:2] patientID age 1 1 25 2 2 34 3 3 28 4 4 52 > patientdata[c(1:3)] patientID age diabetes 1 1 25 Type1 2 2 34 Type2 3 3 28 Type1 4 4 52 Type2 > patientdata[c("diabetes","status")] diabetes status 1 Type1 Poor 2 Type2 Improved 3 Type1 Excellent 4 Type2 Poor > patientdata$age [1] 25 34 28 52
用$生成diabetes和status的列聯表
Excellent Improved Poor Type1 1 0 1 Type2 0 1 1
比數據框$變量名調用變量更簡單的方法是用attach()和detach(),和with
1.attach( )、detach()和with()
attach()可將數據框添加到R的搜索路徑,有了它,調用數據框裏的變量時,就不需要再告訴R現在調用的變量在什麽數據框了。
detach()是將數據框從搜索路徑中移除。
attach()和detach()像是一對兄弟,但事實上,detach不對數據本身作用,可以省略。
summary(mtcars$disp) plot(mtcars$mpg,mtcars$disp) plot(mtcars$mpg,mtcars$wt)
等價於
attach(mtcars) summary(mpg) plot(mpg,disp) plot(mpg,wt) detach(mtcars)
局限:當名稱相同的對象不止一個,用attach()就會出問題。原始對象將取得優先權,後來的對象將被屏蔽(masked)。
with()如何得到與上面代碼一樣的結果呢,看如下代碼
with(mtcars,{ print(summary(mpg)) plot(mpg,disp) plot(mpg,wt)})
with(mtcars,{print(summary(mpg))
plot(mpg,disp)
plot(mpg,wt)})
註意花括號裏要沒有逗號,要換行隔開,我自己運行,沒換行不能實現。花括號的語句都是針對數據框mtcars,如果花括號裏只有一條語句,花括號可以省略
局限:賦值僅在此函數的括號內剩下。
改進:用特殊復制符<<-代替<-,則可將對象保存到with外的全局環境中。
> with(mtcars,{nokeepstates<-summary(mpg) + keepstates<<-summary(mpg)}) > nookeepstates Error: object ‘nookeepstates‘ not found > keepstates Min. 1st Qu. Median Mean 3rd Qu. Max. 10.40 15.43 19.20 20.09 22.80 33.90
結果不言而喻,因為keepstates保存到with()之外的全局環境中,而nookeepstates沒有,所以當離開了with(),只有keepstates存在。
2.實力標識符
通過row.names=某個變量指定實例標識符,我的理解,是我們在學校的學號,工作中的工號那樣的作用
patientdata<-data.frame(patientID,age,diabetes,status,row.names=patientID)將patientID指定為R中標記各類打印輸出和圖形中實例名稱所用變量(這是書本的原話),我的理解是patientID是數據框中唯一可以標識身份的變量。每個實例或者說是觀測來說是獨一無二的。
2.2.5 因子(決定數據的分析方式和視覺呈現方式)
變量 | ||
名義型變量 | 沒順序的類別變量 | 因子 |
有序型變量 | 有順序關系,沒數量關系 | 因子 |
連續型變量 | 同時有順序和變量 | ---- |
函數:factor()
作用:以整數向量形式存儲類別值,從1開始,將一個由字符串(原始值)組成的內部向量映射到這些整數上。
將原始值轉化成數值型變量
- 名義型變量--->以整數向量形式存儲
disabetes <- c("Type1", "Type2" ,"Typye1", "Type1")
> diabetes<-factor(diabetes) #將向量diabetes存儲為(1,2,1,1) > diabetes #關聯關系為1=Type1,2=Type2 (賦值根據字母順序定) [1] Type1 Type2 Type1 Type2 Levels: Type1 Type2 > str(diabetes) Factor w/ 2 levels "Type1","Type2": 1 2 1 2
註意:針對diabetes的任何分析都將作為名義型向量對的,並自動選擇適合這一測量尺度的統計方法。
- 有序型變量---->以整數向量形式存儲(在factor()函數中藥加入參數ordered=TRUE)
> status<-c("Poor","Improved","Excellent","Poor") > status [1] "Poor" "Improved" "Excellent" "Poor" > status<-factor(status,ordered=TRUE,levels = c("Poor","Improved","Excellent")) #因子的水平默認依據字母順序而定,levels覆蓋默認排序 > str(status) Ord.factor w/ 3 levels "Poor"<"Improved"<..: 1 2 3 1
註意:針對此變量進行的任何分析都會作為有序型變量對待,並自動選擇合適的統計方法
- 數值型變量(需要用到參數levels和labels)
假設男性編碼成1,女性編碼成2
> sex<-c(1,1,2) > sex<-factor(sex,levels = c(1,2),labels = c("Male","Female")) > str(sex) Factor w/ 2 levels "Male","Female": 1 1 2
註意:標簽的順序labels = c( "Male", "Female")和水平一致levels = c( 1, 2 )
標簽"Male"和"Female"將代替1和2在結果種輸出,而不是1或者2的性別變量將被當作缺失值。> sex<-c(1,2,3) > sex<-factor(sex,levels = c(1,2),labels = c("Male","Female")) > str(sex) Factor w/ 2 levels "Male","Female": 1 2 NA
下面看普通因子和有序因子如何影響數據分析
#以向量形式輸入
patientID <- c(1, 2, 3, 4) age <- c(25, 34, 28, 52) diabetes <- c("Type1", "Type2", "Type1", "Type1") status <- c("Poor", "Improved", "Excellent", "Poor") #將diabetes指定為普通因子
diabetes <- factor(diabetes)
#將status指定為有序型因子 status <- factor(status, order=TRUE)
#將數據合並為數據框 patientdata <- data.frame(patientID, age, diabetes, status)
#str(object)顯示對象的結果,提供R中某個對象(此例為數據框)的信息 str(patientdata)
$summary() 區別對待各個變量,顯示對象的統計概要 summary(patientdata)
運行後
> str(patientdata) ‘data.frame‘: 4 obs. of 4 variables: $ patientID: num 1 2 3 4 $ age : num 25 34 28 52 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 2 $ status : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3 > summary(patientdata) patientID age diabetes status Min. :1.00 Min. :25.00 Type1:2 Excellent:1 1st Qu.:1.75 1st Qu.:27.25 Type2:2 Improved :1 Median :2.50 Median :31.00 Poor :2 Mean :2.50 Mean :34.75 3rd Qu.:3.25 3rd Qu.:38.50 Max. :4.00 Max. :52.00
運行str()後,清楚地顯示diabetes是一個因子,status是有序型因子以及數據框在內部如何編碼
運行summary()後,各個變量區別被對待,顯示連續型變量age的最小值、最大值、均值、四分位數。而diabetes和status(各水平)這兩個因子則顯示頻數值。
2.2.6 列表
定義:對象(或成分)的有集合。允許整合若幹(可能無關)對象到單個對象名下。
因此,某個對象可能是若幹向量、矩陣、數據框甚至其他列表的組合。
創建列表的函數: list()
mylist <- list( object1, object2,...)
列表中的對象命名: mylist<- list(name1 = object1,name2 = object2)
g<-"My First List" #字符串 h<-c(25,26,18,39)#數值型向量 j<-matrix(1:10,nrow=5)#5*2的矩陣 k<-c("one","two","three")#字符型向量 mylist<-list(title=g,h,j,k) #創建列表,其中,第一個對象命名為title
> mylist $title [1] "My First List" [[2]] [1] 25 26 18 39 [[3]] [,1] [,2] [1,] 1 6 [2,] 2 7 [3,] 3 8 [4,] 4 9 [5,] 5 10 [[4]] [1] "one" "two" "three"
訪問列表中的元素 1.可通過雙括號致命帶包某個成分的數字。2.通過名稱
> mylist[[1]] [1] "My First List" > mylist[["title"]] [1] "My First List" > mylist$title #要命名了才可以 [1] "My First List"
以上是基本的各種數據結構。
《R語言實戰》之 創建數據集(第二章,各種數據結構)