第二章數據結構與基本運算



2.1數據類型

R語言的數據類型主要有數值型、字符型、邏輯型、複數型和原味型。此外,也可以是默認值。

原味型是以二進制形式保存數據。

默認值,當一個元素或值在統計的時候是“不可得到”(not available)或“缺失值”(missing value)時,相關位置可能會被保留並且賦予一個特定的NA值。任何NA的運算結果都是NAIs.na()函數用來檢測數據是否缺失,如果數據缺失,則返回TRUE,否則返回FALSE

 

常見的辨別和轉換數據對象類型的函數

數據類型

辨別函數

轉換函數

Character

Is.character()

As.character()

complex

Is.complex()

As.complex()

Double

is.double()

as.double()

integer

Is.integer()

As.integer()

logical

Is.logical()

as.logical()

na

Is.na()

As.na()

numeric

Is.numeric()

As.numeric()

 

2.2數據對象

R語言裏的數據對象主要有6種結構:向量(vector)、矩陣(matrix)、數組(array)、因子(factor)、列表(list)和數據框(data frames)。

 

1>向量(vector)是由有相同基本類型元素組成的序列,相當於一維數組。

函數Paste()可以把自變量對應元素連成一個字符串 

> v<-paste("x",1:5,sep=" ")

> v

[1] "x 1" "x 2" "x 3" "x 4" "x 5"

 

此外,也可以用assign()函數對向量進行賦值,例如:

> assign("w",c(1,3,5,7))

> w

[1] 1 3 5 7

 

seq(from,to,by),from表示序列的起始值,to表示序列的終止值,by表示步長。

有時我們需要關注的是數列的長度,這時可以操作如下:

> seq(1,by=2,length=10)

 [1]  1  3  5  7  9 11 13 15 17 19

 

Rep()函數可以用各種複雜的方式重複一個對象。其命令是:rep(x,times,...),其中X表示要重複的對象,times表示重複的次數。

> rep(c(1,3),4)

[1] 1 3 1 3 1 3 1 3

> rep(c(1,3),each=4)

[1] 1 1 1 1 3 3 3 3

> rep(1:3,rep(2,3))

[1] 1 1 2 2 3 3

第一個是向量c(1,3)重複4次的情況,也可以用第二個對每個元素進行重複,第三個是函數rep()的嵌套使用,裏層的rep(2,3)實際就等價於向量c(2,2,2).

   

               向量運算常見函數表

函數

用途

Sum()

求和

Max()

求最大值

Min()

求最小值

Range()

求極差(全距)

Mean()

求均值

Median()

求中位數

Var()

求方差

Sd()

求標準差

Sort()

排序

Rev()

反排序

Rank()

求秩

Append()

添加

Replace()

替換

Match()

匹配

Pmatch

部分匹配

All()

判斷所有

Any()

判斷所有

Prod

 

2>矩陣 是將數據用行和列排列的長方形表格,它是二維的數組,其單元必須是相同的數據類型。通常用列來表示不同的變量,用行表示各個對象。R語言生成矩陣的函數是matrix(),其句法是:matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)

其中,data項爲必要的矩陣元素,nrow爲行數,ncol爲列數,nrow與ncol的乘積應爲矩陣元素個數,dimnames給定行和列的名稱,byrow項控制排列元素時是否按行進行,默認byrow=FALSE,即按列順序排列。

取一個方陣的對角陣:

> a     [,1] [,2] [,3][1,]    1    5    9[2,]    2    6   10[3,]    3    7   11[4,]    4    8   12

> diag(a)[1]  1  6 11

對一個向量應用diag()函數,可以產生以這樣向量的元素爲對角元素的對角矩陣: 

> diag(diag(a))     [,1] [,2] [,3][1,]    1    0    0[2,]    0    6    0[3,]    0    0   11

 

   只輸入一個正整數,則diag()函數將會生成一個對應維數的單位矩陣:

> diag(3)     [,1] [,2] [,3][1,]    1    0    0[2,]    0    1    0[3,]    0    0    1

 

矩陣合併還可以使用rbind()cbind()函數來對矩陣按照行或列進行合併。

> b<-matrix(c(1,1,1,1),2,2)

> rbind(b,b)

     [,1] [,2][1,]    1    1[2,]    1    1[3,]    1    1[4,]    1    1

> cbind(b,b)

     [,1] [,2] [,3] [,4][1,]    1    1    1    1[2,]    1    1    1    1

   對於得到的矩陣,可以使用A[i,j]得到A矩陣第i行第j列的元素,A[i,]A[,J]分別表示返回第i行和第j列的所有元素。也可以使用A[i:l,j:l]的形式來獲得多行多列的子矩陣。

> A<-matrix(1:12,3,4)

> A[2,3]

[1] 8

> A[2,]

[1]  2  5  8 11

> A[,3]

[1] 7 8 9

> A[1:3,2]

[1] 4 5 6

 

2.3數組 即可以看作是帶多個下標的且類型相同的元素的集合,也可以看作是向量和矩陣的推廣,一維數組就是向量,二維數組就是矩陣。數組的生成函數是array(),其句法是:

Arraydata=NA,dim=length(data),dianames=NULL

其中data表示數據,可以爲空;dim表示維數,dimnames可以是更改數組的維度的名稱。

其中dim()函數可以返回數組的維數,例如:

> x<-array(1:24,c(3,4,2))

> x

, , 1      [,1] [,2] [,3] [,4][1,]    1    4    7   10[2,]    2    5    8   11[3,]    3    6    9   12 , , 2      [,1] [,2] [,3] [,4][1,]   13   16   19   22[2,]   14   17   20   23[3,]   15   18   21   24> dim(x)

[1] 3 4 2

Dim()還可以用來將向量轉換成數組或矩陣。例如:

> z<-c(1,3,4,5,6,7,8,9,1,3,4,5)

> dim(z)=c(2,2,3)

> z

, , 1      [,1] [,2][1,]    1    4[2,]    3    5 , , 2      [,1] [,2][1,]    6    8[2,]    7    9 , , 3      [,1] [,2][1,]    1    4[2,]    3    5

 

2.4 因子  分類型數據(category data)經常要把數據分成不同的水平或因子(factor),如學生的性別包含男和女兩個因子。因子代表變量的不同可能水平(即使在數據中不出現),在統計分析中十分有用。例如,將0,1轉換爲“yes”和“no”就很方便。在R裏可以使用factor函數來創建因子,函數形式如下:

Factorx=character(),levels,labels=levels,exclude=NA,ordered=is.ordered(x))

其中,levels用來指定因子的水平,labels用來指定水平的名字,exclude表示在x中需要排除的水平,ordered用來決定因子的水平是否有次序。

     

2.5 列表 如果一個數據對象需要含有不同的數據類型,則可以採用列表(list)。列表中包含的對象又稱爲它的分量(components,分量可以是不同的模式或類型,如一個列表可以包括數值向量、邏輯向量、矩陣、字符和數組等。創建列表的函數是list(),其句法是:

List(變量1=分量1,變量2=分量2...)

例如:

> x<-c(1,1,2,2,3,3,3)

> y<-c("女","男","男","女","女","女","男")

> z<-c(80,85,92,76,61,95,83)

> (lst<-list(class=x,sex=y,score=z))

$class[1] 1 1 2 2 3 3 3 $sex[1] "女" "男" "男" "女" "女" "女" "男" $score[1] 80 85 92 76 61 95 83

 

若要訪問列表的某一部分,則可以用lst[[1]],lst[[2]]的形式訪問,若要訪問第二個分量的前三個元素則可以用lst[[2]][1:3]:

> lst[[3]][1] 80 85 92 76 61 95 83

> lst[[2]][1:3][1] "女" "男" "男"

由於分量可以被命名,因此,我們可以在列表名稱後加$符號,再寫上成分名稱來訪問列表分量。其中,成分名可以簡寫到與其他成分能夠區分的最短程度,如:

> lst$score

[1] 80 85 92 76 61 95 83

> lst$sc

[1] 80 85 92 76 61 95 83

2.6 數據框  是一種矩陣形式的數據,但數據框中各列可以是不同類型的數據。數據框每列是一個變量,每行是一個觀測。

其句法是:

Data.frame(...,row.names=NULL,check.rows=FALSE,...)

數據框的列名默認爲變量名,也可以對列名進行重新命名。

Version:1.0 StartHTML:0000000107 EndHTML:0000003042 StartFragment:0000000127 EndFragment:0000003024 

> (student<-data.frame(x,y,z))

  x  y  z1 1 女 802 1 男 853 2 男 924 2 女 765 3 女 616 3 女 957 3 男 83

 > row.names(student)<-c("w","z","l","j","h","s","p")

> student

  x  y  zw 1 女 80z 1 男 85l 2 男 92j 2 女 76h 3 女 61s 3 女 95p 3 男 83

 

數據框的引用

(1)以數組形式訪問

> student[,"z"][1] 80 85 92 76 61 95 83

> student[,3][1] 80 85 92 76 61 95 83

> student[1:5,1:3]

  x  y  zw 1 女 80z 1 男 85l 2 男 92j 2 女 76h 3 女 61

> student[,]

  x  y  zw 1 女 80z 1 男 85l 2 男 92j 2 女 76h 3 女 61s 3 女 95p 3 男 83

 

(2)以列表形式訪問數據框 

> student$z

[1] 80 85 92 76 61 95 83

> student[["z"]]

[1] 80 85 92 76 61 95 83

> student[[3]]

[1] 80 85 92 76 61 95 83

還可以篩選出符合我們條件的數據,如上面的數據,要得到成績大於80分的學生,則可以按如下的方法得到。

> student[student$z>80,]

  x  y  zz 1 男 85l 2 男 92s 3 女 95p 3 男 83

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章