1. 程式人生 > >《R語言實戰》之 創建數據集(第二章,各種數據結構)

《R語言實戰》之 創建數據集(第二章,各種數據結構)

前三 實戰 創建 data div mask 結果 搜索 全局

數據集

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語言實戰》之 創建數據集(第二章,各種數據結構)