2.1數據類型
R語言的數據類型主要有數值型、字符型、邏輯型、複數型和原味型。此外,也可以是默認值。
原味型是以二進制形式保存數據。
默認值,當一個元素或值在統計的時候是“不可得到”(not available)或“缺失值”(missing value)時,相關位置可能會被保留並且賦予一個特定的NA值。任何NA的運算結果都是NA。Is.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(),其句法是:
Array(data=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函數來創建因子,函數形式如下:
Factor(x=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