文章參考 << R 數據分析 —— 方法與案例詳解 >>數組
R的官方網站是http://www.r-project.org, 數據結構
在R官方主頁點擊download R,而後選擇對應的鏡像後,在右側下載和安裝包欄目裏會app
出現三種操做系統的R版本(Linux、(Mac) OS X、Windows),選擇點擊相應的操做系函數
統後,再選擇點擊base就會進入R的下載頁面,在頁面上會出現R的最新版本和安裝說明等網站
不過,要使用RStudio,除了安裝R開發環境後,還須要到spa
http://www.rstudio.org/download/desktop/ 操作系統
上下載適合你電腦的RStudio版本並安裝。 component
R的安裝包有幾種方法,這裏主要介紹其中兩種方法: orm
(1)在線安裝。 對象
好比須要安裝」class」這個擴展包,輸入命令install.packages(「class」)執行便可。
也能夠同時安裝多個包,好比需同時安裝「class」,「cluster」兩個包,輸入命
令install.packages(c(「class」,」cluster」) )。
(2)利用Rstudio安裝。
Rstudio在下一節將會詳細介紹。
在Rstudio右下角欄目裏點
擊「packages」而後再點擊 「install
packages」, 會出現如圖的對話框,
在packages對話框裏輸入須要安裝的
包名,好比輸入 class,就能夠安裝包
工做路徑設置的函數
函數 功能
getwd() 顯示當前工做目錄
setwd(「mydir」) 修改當前工做目錄
ls() 列出當前工做空間的全部對象
rm() 刪除一個或多個對象
help(options) 顯示可用選項的說明
save.image(「myfile」) 保存工做空間到文件myfile.RData中
load(「myfile」) 讀取一個工做空間myfile.RData
q() 退出。並詢問是否保存當前工做空間
二.R數據結構和基本運算
R語言的數據類型主要有:包括數值型、邏輯型、字符型、複數型,原型 。此外,也能夠
是缺省值。
一、數值型(numeric)
這種數據的形式是實數。能夠寫成整數(integers),小數(decimal fractions),或
科學記數(scientific notation)的方式。數值型其實是兩種獨立模式的混合說法,即整數
型(integers)和雙精度型(double-precision)。該種類型數據默認是雙精度型數
據(double-precision)。
二、字符型(character)
這種數據的形式是夾在雙引號「」或單引號‘ ’之間的字符串,如「MR」。
三、邏輯型(logical)
這種數據只能取T(TRUE)或F(FALSE)值。
四、複數型(complex)
這種數據是形如a+bi形式的複數。
五、原味(原始)型(raw)
這種類型以二進制形式保存數據。
六、缺省值(missing value)
有些統計資料是不完整的。當一個元素或值在統計的時候是「不可獲得」(not
available)或「缺失值」(missing value)的時候,相關位置可能會被保留而且賦予一個
特定的NA(not available)值。任何NA的運算結果都是NA。is.na()用來檢測數據是否缺失
,若是數據缺失,則返回TRUE,不然,返回FALSE。
例如:
> z<-c(1:5,NA) #生成向量z
> z #返回z向量的結果
[1] 1 2 3 4 5 NA
> is.na(z) #識別z向量的值是否有缺失值
[1] FALSE FALSE FALSE FALSE FALSE TRUE
上面,咱們用c()函數首先生成了向量z, c()函數的具體使用方法詳見2.2.1。is.na()返回的結果
是前面5個元素都FALSE,最後1個是TRUE,這說明前面5個都不是缺失值,最後1個是缺失值。
數據類型 辨別函數 轉換函數
numeric is.numeric() as.numeric()
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()
常見的辨別和轉換對象類型的函數以下表:
表2-1 辨別和轉換數據對象類型的函數
R語言裏的數據對象主要有六種結構:
l 向量(vector)
l 矩陣(matrix)
l 數組(array)
l 因子(factor)
l 列表(list)
l 數據框(data frames)
不過在這以前,咱們先了解一下R在浮點運算中的一些精度問題。
例如:(0.6>0.6?)
> x <- seq(0, 1, by = 0.2) #seq()生成序列的函數,詳見2.2.1部分
> y <- seq(0, 1, by = 0.2)
> y[4]
[1] 0.6
> x[3]
[1] 0.4
> 1 - x[3]
[1] 0.6
> y[4] > 1 - x[3]
[1] TRUE
注意:這也是在計算機運算裏面常常出現的一個問題(不過表示出來結果這樣其實應該
算是R的缺陷,稍微高級的數學運算軟件通常都會經過一些方法來克服),簡單來講就是浮點
數在計算機中的表達有限制,不能以任意精度存儲,因此尤爲是微小的數字或巨大的數字在
運算時常常會有些意外狀況。
所以有時候在處理R裏面的數據的時候,特別是在判斷的時候,須要特別注意精度問題。
(1)向量賦值
向量(vector)是由有相同基本類型元素組成的序列,至關於一維數組。
例:> x <-c(1,3,5,7,9) #用c( )構建向量
這是一個用函數c( )完成的賦值語句。這裏的函數c( )能夠有任意多個參數,而它輸出的
值是一個把這些參數首尾相連造成的一個向量。
「#」符號後面跟的是註釋,在寫程序的時候清楚代表程序工做的註釋能大大提升程序的可
讀性。
「<-」是賦值符號,表示把<-後面的內容賦值給<-前面的內容,R的賦值符號除了「<-」外,
還有「->」、「=」, ->的用法和<-的用法正好相反。
注意:R也容許「=」賦值,但不是標準語法,有些狀況下用「=」有可能會出現問題,所以一
般狀況不建議使用「=」。
例如:
> c(1,3,5,7,9) -> y #將c()生成的數值向量賦值給y
> y
[1] 1 3 5 7 9
> z <- c("Male","Female","Female","Male","Male") #將c()生成的字符向量賦值給z
> z
[1] "Male" "Female" "Female" "Male" "Male"
> u=c(TRUE,FALSE,TRUE,FALSE,FALSE) #將c()生成的邏輯向量賦值給u
> u
[1] TRUE FALSE TRUE FALSE FALSE
此處,y是數值向量,z是字符型向量,u是邏輯型向量。
注意:單個向量中的數據要求是相同類型,同一貫量中沒法混雜不一樣類型的數據。
對於字符向量,一個很重要的函數paste()能夠把自變量對應元素連成一個字符串,長
度不相同時,較短的向量被重複使用。
例如:
> v<-paste("x",1:5,sep="")
> v
[1] "x1" "x2" "x3" "x4" "x5「
此外,也能夠用assign()函數對向量進行賦值。例如:
> assign("w",c(1,3,5,7,9))
> w
[1] 1 3 5 7 9
(2)向量運算
對於向量的乘法,除法,乘方運算,其方法是對應向量的每一個份量作乘法、除法和乘方運算。
例如:>x <-c(1,3,5,7,9)
> c(1,3,5,7,9) -> y
> x * y #對應元素相乘
[1] 1 9 25 49 81
> x / y
[1] 1 1 1 1 1
> x^2
[1] 1 9 25 49 81
> y^x
[1] 1 27 3125 823543 387420489
(2)向量運算
此外,」%/%」表示整數除法(5%/%3爲1),」%%」表示求餘數(5%%3爲2)。
向量運算會對該向量的每個元素都進行一樣的運算。出如今同一個表達式的向量最好
同一長度。若是長度不一,表達式中短的向量將會被循環使用,表達式的值將是一個和最長
的向量等長的向量。
例如:
> c(1,3,5)+c(2,4,6,8,10)
[1] 3 7 11 9 13
第一個向量的長度小於第二個向量,循環補齊第一貫量的長度,即爲c(1,3,5,1,3)
(3)生成有規則序列
l R能夠產生正則序列,最簡單的是用「::」符號,就能夠產生有規律的正則序列。例如:
> (t <- 1:10)
[1] 1 2 3 4 5 6 7 8 9 10
> (r <- 5:1)
[1] 5 4 3 2 1
> 2*1:5
[1] 2 4 6 8 10
其中,5:1表示逆向序列, 而且在表達式運算中,「:」的運算級別最高,即上面的2*1:5
,R是先生成1-5的向量,而後再乘上2。這裏在表達式外面套()的意思把結果直接打印出來,
好比>t <- 1:10而不套括號,則R將運算結果保存在t對象裏,可是不會把t的結果打印出來。
2.2.1 向量
(3)生成有規則序列
l 能夠用函數seq()產生有規律的各類序列,其句法是:seq(from, to, by),from表示序列的
起始值,to表示序列的終止值,by表示步長。其中,by參數(參數by)省略時,默認步長爲1
。而且函數seq()也能夠產生降序數列。例如:
> seq(1,10,2) #生成從1開始,10結束,步長爲2的序列
[1] 1 3 5 7 9
> seq(1,10) #默認步長爲1
[1] 1 2 3 4 5 6 7 8 9 10
> seq(10,1,-1) #步長爲-1
[1] 10 9 8 7 6 5 4 3 2 1
2.2.1 向量
(3)生成有規則序列
有時候咱們須要關注的是數列的長度,這時咱們能夠操做以下:
> seq(1,by=2,length=10)
[1] 1 3 5 7 9 11 13 15 17 19
(3)生成有規則序列
l rep()函數能夠用各類複雜的方式重複一個對象。其命令是:rep(x, times, ...),其中x表示要
重複的對象,times表示重複的次數。
> rep(c(1,3),4) #將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)。
2.2.1 向量
(4)向量的常見函數
向量裏元素的個數稱爲向量的長度(length)。長度爲1的向量就是常數(或標量)。函
數length()能夠返回向量的長度,mode()能夠返回向量的數據類型,min()返回向量的最小值
,max()返回向量的最大值,range()返回向量的範圍,which.min()、which.max()返回在第幾
個份量求到最小、最大值。例如:
>x <-c(1,3,5,7,9)
> length(x)
[1] 5
> min(x)
[1] 1
> range(x)
[1] 1 9
(4)向量的常見函數
R提供了不少的函數能夠對向量進行運算,這裏不一 一列舉,下面列出幾個經常使用函數表。
函數 用途 函數 用途
sum() 求和 rev() 反排序
max() 求最大值 rank() 求秩
min() 求最小值 append() 添加
range() 求極差(全矩) replace() 替換
mean() 求均值 match() 匹配
median () 求中位數 pmatch() 部分匹配
var() 求方差 all() 判斷全部
sd() 求標準差 any() 判斷部分
sort() 排序 prod() 積
表2-2 對向量運算常見函數表
(5)向量的索引
l 在R中提供了靈活的向量下標運算。取出向量的某一個元素能夠用x[i]。也能夠經過賦值語
句來改變一個或多個元素的值。例如:
> x <- c(1,3,5)
> x[2] #返回x向量的第2元素
[1] 3
>(c(1,2,3)+4)[2]
#先進行向量運算c(1,2,3)+4,再返回該
向量的第2個元素
[1] 6
> x[2] <- 10 #將10賦值給x向量的第2個
元素,,即替換掉原來的值
> x
[1] 1 10 5
> x[c(1,3)] <- c(9,11) #將9和11賦值給x
向量的第1和第3個元素
> x
[1] 9 10 11
2.2.1 向量
> x <- c(1,3,5)
> x < 4
#返回邏輯結果,即x向量的元素是否小於4
[1] TRUE TRUE FALSE
> x[x<4] #返回x向量裏小於4的元素
[1] 1 3
> z <- c(-1,1:3,NA)
> z
[1] -1 1 2 3 NA
> z[is.na(z)] <- 0 #將0賦值給z向量裏的N
A值
> z
[1] -1 1 2 3 0
> z <- c(-1,1:3,NA)
y <- z[!is.na(z)]
#將z裏的非缺失值賦值給y
> y
[1] -1 1 2 3
l 把i換成邏輯語句也能夠對向量進行邏輯運算。例如:
2.2.1 向量
> x<-c(-3,-2,-1,0,5,7)
> y <- numeric(length(x))
#生成於x向量長度相同的數值型向量
> y
[1] 0 0 0 0 0 0
> y[x<0] <- 1-x[x<0]
#求出x中小於0元素對應位置,y對應位
置的值用1-x[x<0]替代
> y
[1] 4 3 2 0 0 0
>y[x>=0] <- 1+x[x>=0]
#求出x中大等於0元素對應位置,y對應位
置的元素用1-x[x<0]賦值
> y
[1] 4 3 2 1 6 8
第二章 數據結構與基本運算
l 這種方法能夠用在對分段函數的定義上。例如:
l 若是x[i],i取值是小於0的負整數,則表示刪除相應位置的元素。
矩陣(matrix)是將數據用行和列排列的長方形表格,它是二維的數組,其單元必須是
相同的數據類型。一般用列來表示不一樣的變量,用行表示各個對象。R語言生成矩陣的函數
是matrix ( ),其句法是:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中,data 項爲必要的矩陣元素,nrow 爲行數,ncol 爲列數,注意 nrow 與 ncol 的乘積應爲
矩陣元素個數, dimnames 給定行和列的名稱,byrow 項控制排列元素時是否按行進行,默
認byrow=FALSE,即按列順序排列。
例如:> matrix(1:12,nrow=4,ncol=3) #默認按列填充
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> matrix(1:12,nrow=4,ncol=3,byrow=T) #按行填充
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
矩陣的運算種類多,方法多,此處做簡要介紹。
l 矩陣的轉置能夠用函數t()來計算,相似的,若將函數 t()做用於一個向量x,則當作x爲列向量,
返回結果爲一個行向量。若想獲得一個列向量,可用 t(t(x))。
> (A <- matrix(1:12,nrow=3,ncol=4))
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> t(A)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
矩陣的運算種類多,方法多,此處做簡要介紹。
l 矩陣的加減法
>A <- B <- matrix(1:12,nrow=3)
#將生成的矩陣賦給B,同時又賦給A
> A+B
[,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
l 矩陣的數乘
> 3*A
[,1] [,2] [,3] [,4]
[1,] 3 12 21 30
[2,] 6 15 24 33
[3,] 9 18 27 36
矩陣的運算種類多,方法多,此處做簡要介紹。
l 矩陣的乘法,除了矩陣須要知足能夠相乘的要求以外,在R中須要用運算符「%*%」來進行
計算。「*」運算只是對應的元素相乘。若是要計算t(A)%*%B還能夠用函數crossprod(A,B),
這種計算的效率更高。
> B <- t(A)
> A%*%B
[,1] [,2] [,3]
[1,] 166 188 210
[2,] 188 214 240
[3,] 210 240 270
l R中還能夠對矩陣的對角元素進行計算,例如要取一個方陣的對角元素:
> (A <- matrix(1:16,nrow=4))
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> diag(A)
[1] 1 6 11 16
另外,對一個向量應用diag()函數能夠產生以這樣向量的元素爲對角元的對角矩陣
> diag(diag(A))
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
若是輸入只有一個正整數的話,diag()函數將會生成一個對應維數的單位陣。
> diag(3)
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
l 求逆,在R中使用solve()函數能夠計算,若是是solve(a,b)的話是解線性方程組ax=b,b默
認爲單位矩陣。
> (A <- matrix(rnorm(16),4,4)) #rnorm()是生成16個標準正態分佈隨機數
[,1] [,2] [,3] [,4]
[1,] 0.44576927 -0.9841294 -0.1291554 0.18165406
[2,] 1.04034856 1.3658480 -0.6905046 0.06254394
[3,] -0.02689138 -0.5389127 -0.1356344 1.71923910
[4,] -0.05693438 1.4905866 -0.2479709 0.03399939
> solve(A)
[,1] [,2] [,3] [,4]
[1,] -4.538443 2.6321129 0.4872459 -5.232100
[2,] -1.936148 0.7670728 0.2011416 -1.237585
[3,] -10.806250 4.0894901 1.1996337 -10.448150
[4,] -1.530421 0.6042453 0.7469654 -1.294048
l 求特徵值和特徵向量的運算,在R中能夠經過函數eigen()來獲得。
> (A <- diag(4)+1)
[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
> (A.eigen <- eigen(A,symmetric=T))
$values #此處返回的結果是列表格式,具體詳見2.2.5
[1] 5 1 1 1
$vectors
[,1] [,2] [,3] [,4]
[1,] -0.5 0.8660254 0.0000000 0.0000000
[2,] -0.5 -0.2886751 -0.5773503 -0.5773503
[3,] -0.5 -0.2886751 -0.2113249 0.7886751
[4,] -0.5 -0.2886751 0.7886751 -0.2113249
l 對於正定矩陣A,能夠對其進行Choleskey分解,即A=P T P,其中P爲上三角矩陣,在R中
能夠用函數chol()進行Choleskey分解。
> chol(A)
[,1] [,2] [,3] [,4]
[1,] 1.414214 0.7071068 0.7071068 0.7071068
[2,] 0.000000 1.2247449 0.4082483 0.4082483
[3,] 0.000000 0.0000000 1.1547005 0.2886751
[4,] 0.000000 0.0000000 0.0000000 1.1180340
若矩陣爲對稱正定陣,則能夠利用Choleskey分解來求行列式的值以及矩陣的逆,而且這
種用法更有效。
> prod(diag(chol(A))^2)#求出A矩陣的對角元素,而後求平方,再求連乘積
[1] 5
> det(A) #求A矩陣行列式
[1] 5
> chol2inv(chol(A)) 求Choleskey分解後的逆
[,1] [,2] [,3] [,4]
[1,] 0.8 -0.2 -0.2 -0.2
[2,] -0.2 0.8 -0.2 -0.2
[3,] -0.2 -0.2 0.8 -0.2
[4,] -0.2 -0.2 -0.2 0.8
l 奇異值分解:
若A爲m行n列矩陣,秩爲r,則矩陣能夠進行奇異值分解獲得A=UDV T 。在R中能夠經過svd(
)函數進行計算。 $u
[,1] [,2] [,3]
[1,] -0.5290354 0.74394551 0.4082483
[2,] -0.5760715 0.03840487 -0.8164966
[3,] -0.6231077 -0.66713577 0.4082483
$v
[,1] [,2] [,3]
[1,] -0.07736219 -0.71960032 -0.4076688
[2,] -0.19033085 -0.50893247 0.5745647
[3,] -0.30329950 -0.29826463 -0.0280114
[4,] -0.41626816 -0.08759679 0.2226621
[5,] -0.52923682 0.12307105 -0.6212052
[6,] -0.64220548 0.33373889 0.2596585
> (A <- matrix(1:18,3,6))
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 4 7 10 13 16
[2,] 2 5 8 11 14 17
[3,] 3 6 9 12 15 18
>(A.svd <- svd(A))
#求矩陣A的svd分解,並將結果賦值給A.svd
$d
[1] 4.589453e+01 1.640705e+00 1.366522e-15
l QR分解:
實數矩陣A的QR分解是把A分爲A=QR,這裏的Q是正交矩陣,而R是上三角矩陣。QR分
解在R中能夠用函數qr()計算.其中,rank項返回矩陣的秩,qr項包含了矩陣Q和R的信息,
要獲得對應矩陣,能夠用函數qr.R(),qr.Q()計算。
2.2.2 矩陣
第二章 數據結構與基本運算
l QR分解。例如:
> B <- matrix(1:16,4,4)
> qr(B)
$qr
[,1] [,2] [,3] [,4]
[1,] -5.4772256 -12.7801930 -2.008316e+01 -2.738613e+01
[2,] 0.3651484 -3.2659863 -6.531973e+00 -9.797959e+00
[3,] 0.5477226 -0.3781696 1.601186e-15 2.217027e-15
[4,] 0.7302967 -0.9124744 -5.547002e-01 -1.478018e-15
$rank #矩陣的秩
[1] 2
$qraux #Q中的額外信息
[1] 1.182574e+00 1.156135e+00 1.832050e+00 1.478018e-15
$pivot #分解過程當中的旋轉信息
[1] 1 2 3 4
attr(,"class") #返回屬性
[1] "qr"
l QR分解。
例如:
> qr.R(qr(B)) #提取R矩陣
[,1] [,2] [,3] [,4]
[1,] -5.477226 -12.780193 -2.008316e+01 -2.738613e+01
[2,] 0.000000 -3.265986 -6.531973e+00 -9.797959e+00
[3,] 0.000000 0.000000 1.601186e-15 2.217027e-15
[4,] 0.000000 0.000000 0.000000e+00 -1.478018e-15
> qr.Q(qr(B)) #提取Q矩陣
[,1] [,2] [,3] [,4]
[1,] -0.1825742 -8.164966e-01 -0.4000874 -0.37407225
[2,] -0.3651484 -4.082483e-01 0.2546329 0.79697056
[3,] -0.5477226 -1.665335e-16 0.6909965 -0.47172438
[4,] -0.7302967 4.082483e-01 -0.5455419 0.04882607
l 可用kronecker()來計算矩陣的Kronecker積。
m×n
> (A <- matrix(1:4,2,2))
[,1] [,2]
[1,] 1 3
[2,] 2 4
> kronecker(A,B)
[,1] [,2] [,3] [,4]
[1,] 1 1 3 3
[2,] 1 1 3 3
[3,] 2 2 4 4
[4,] 2 2 4 4
> (B <- matrix(rep(1,4),2,2))
[,1] [,2]
[1,] 1 1
[2,] 1 1
l 在R中可以使用dim()獲得矩陣的維數,nrow()求行數,ncol()求列數; rowSums()求各行和,
rowMeans()求行均值, colSums()求各列和, colMeans()求列均值。
l 計算X T X這樣的矩陣逆,例如OLS中的係數矩陣。在R的strucchange包裏面有函
數solveCrossprod()函數能夠很方便的計算。其具體形式以下:
solveCrossprod(X, method = c("qr", "chol", "solve"))
對於method中的求逆方法,qr效率最高,chol精度最高,而solve與solve(crossprod(x,x)
)的效果相同。例如:
> A <- matrix(rnorm(16),4)
> solveCrossprod(A,method="qr") #利用qr分解方法求逆矩陣
[,1] [,2] [,3] [,4]
[1,] 1.5752935 0.3617794 -1.269400 1.5530569
[2,] 0.3617794 0.2996626 -0.139547 0.4616545
[3,] -1.2694003 -0.1395470 1.741550 -1.1275450
[4,] 1.5530569 0.4616545 -1.127545 2.1345205
l 計算X T X這樣的矩陣逆 ,在R的strucchange包裏面有函數solveCrossprod()函數能夠很
方便的計算。
續例:
> solveCrossprod(A,method="chol") #利用Choleskey分解方法求逆矩陣
[,1] [,2] [,3] [,4]
[1,] 1.5752935 0.3617794 -1.269400 1.5530569
[2,] 0.3617794 0.2996626 -0.139547 0.4616545
[3,] -1.2694003 -0.1395470 1.741550 -1.1275450
[4,] 1.5530569 0.4616545 -1.127545 2.1345205
l 計算X T X這樣的矩陣逆 ,在R的strucchange包裏面有函數solveCrossprod()函數能夠很
方便的計算。
續例:
> solveCrossprod(A,method="solve")
[,1] [,2] [,3] [,4]
[1,] 1.5752935 0.3617794 -1.269400 1.5530569
[2,] 0.3617794 0.2996626 -0.139547 0.4616545
[3,] -1.2694003 -0.1395470 1.741550 -1.1275450
[4,] 1.5530569 0.4616545 -1.127545 2.1345205
> solve(crossprod(A,A))
[,1] [,2] [,3] [,4]
[1,] 1.5752935 0.3617794 -1.269400 1.5530569
[2,] 0.3617794 0.2996626 -0.139547 0.4616545
[3,] -1.2694003 -0.1395470 1.741550 -1.1275450
[4,] 1.5530569 0.4616545 -1.127545 2.1345205
l 可以使用lower.tri(),upper.tri()提取到矩陣的上三角和下三角矩陣。結果返回爲邏輯矩陣,
其中diag爲T時包含對角元,默認不含對角元。
lower.tri(x, diag = FALSE)
upper.tri(x, diag = FALSE)
例如:
> lower.tri(A,diag=T)
[,1] [,2] [,3] [,4]
[1,] TRUE FALSE FALSE FALSE
[2,] TRUE TRUE FALSE FALSE
[3,] TRUE TRUE TRUE FALSE
[4,] TRUE TRUE TRUE TRUE
> A[lower.tri(A)]=0
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 0 6 10 14
[3,] 0 0 11 15
[4,] 0 0 0 16
> A <- matrix(1:16,4)
> lower.tri(A)
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
l 在R中定義了row()和col()函數用來返回矩陣的行列下標。另外,也能夠經過使
用x[row(x)<col(x)]=0等語句來獲得矩陣的上下三角矩陣。
例如:
> col(A)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 1 2 3 4
[3,] 1 2 3 4
[4,] 1 2 3 4
> A[row(A)<col(A)]=0
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 2 6 0 0
[3,] 3 7 11 0
[4,] 4 8 12 16
> A <- matrix(1:16,4)
> row(A)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
[4,] 4 4 4 4
l 矩陣中計算行列式的值可使用函數det()來計算,例如對上面的下三角矩陣求行列式:
> det(A)
[1] 1056
l 在R的使用過程當中,常常須要將矩陣轉化爲向量化算子,編寫一個小函數便可實現。
例如:
> vec(A)
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
> vec <- function(x){
+ t(t(as.vector(x)))
+ }
#函數編寫詳細請見3.4
> (A <- matrix(1:6,2,3))
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
l 在時間序列分析中,經常須要用到滯後序列,R中的fMultivar包中的函數tslag()能夠實現
。首先,咱們須要安裝fMultivar,而後再載入該包。 tslag的用法爲
tslag(x, k = 1, trim = FALSE)
其中,x爲一個向量,k爲滯後期數,trim默認返回序列與原序列長度相同,但包含NA值,
若trim=T,則返回不含NA值。例如:
> tslag(x,1:4,trim=T)
[,1] [,2] [,3] [,4]
[1,] 4 3 2 1
[2,] 5 4 3 2
> x <- 1:6
> tslag(x,1:4,trim=F)
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 1 NA NA NA
[3,] 2 1 NA NA
[4,] 3 2 1 NA
[5,] 4 3 2 1
[6,] 5 4 3 2
l 對於矩陣的運算,咱們還可使用apply()函數來進行各類計算,其用法爲
apply(X, MARGIN, FUN, ...) 。其中,X表示須要處理的數據,MARGIN表示函數的做用
範圍,1爲對行運算,2爲對列運算。FUN爲須要運用的函數。例如:
A <- matrix(1:12,3,4)
> apply(A,2,sum) #矩陣的列求和
[1] 6 15 24 33
> apply(A,2,mean) #矩陣的列求均值
[1] 2 5 8 11
> apply(A,2,var) #矩陣的列求方差
[1] 1 1 1 1
> apply(A,2,sd) #矩陣的列求標準差
[1] 1 1 1 1
l 矩陣合併可使用rbind()和cbind()函數來對矩陣按照行和列進行合併。例如:
> B=matrix(c(1,1,1,1),2,2) #生成2×2的矩陣
> rbind(B,B) #將B和B矩陣按行合併
[,1] [,2]
[1,] 1 1
[2,] 1 1
[3,] 1 1
[4,] 1 1
> cbind(B,B) #將B和B矩陣按列合併
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 1 1 1
l 對於獲得的矩陣,可使用A[i,j]獲得A矩陣第i行第j列的元素,A[i,]和A[,j]分別表示返回第i
行和第j列的全部元素。也可使用A[i:k,j:l]的形式來得到多行多列的子矩陣。
例如:
> A=matrix(1:12,3,4)
> A[2,3] #返回矩陣第2行第3列元素
[1] 8
> A[2,] #返回矩陣第2行全部元素
[1] 2 5 8 11
> A[,3] #返回矩陣第3列全部元素
[1] 7 8 9
> A[1:3,2] #返回矩陣第1到3行,且是第2列的元素
[1] 4 5 6
l 使用as.matrix()把非矩陣格式的轉換成矩陣格式,函數is.matrix()能夠辨別是否矩陣。
數組(array)能夠看做是帶有多個下標的類型相同的元素的集合。也能夠看做是向量和
矩陣的推廣,一維數組就是向量,二維數組就是矩陣。數組的生成函數是array(),其句法是:
array(data = NA, dim = length(data), dimnames = NULL)
其中data表示數據,能夠爲空,dim表示維數,dimnames能夠更改數組的維度的名稱。例如:
> (xx <- array(1:24,c(3,4,2))) # 產生維數爲(3,4,2)的3維數組
, , 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()函數能夠返回
數組的維數,dim()還能夠用來將向量轉化成數組或矩陣(見下例)。數組也能夠
用「+」、「-」、「*」、「/」以及函數等進行運算,其方法和矩陣相相似,這裏再也不詳述。
> xx[2,3,2]
[1] 20
> xx[2,1:3,2]
[1] 14 17 20
> xx[,2,]
[,1] [,2]
[1,] 4 16
[2,] 5 17
[3,] 6 18
> dim(xx)
[1] 3 4 2
>zz=c(2,5,6,8,1,4,6,9,10,7,3,5)
>dim(zz)=c(2,2,3)
#將向量轉成維度爲(2,2,3)
的數組
> zz
, , 1
[,1] [,2]
[1,] 2 6
[2,] 5 8
, , 2
[,1] [,2]
[1,] 1 6
[2,] 4 9
, , 3
[,1] [,2]
[1,] 10 3
[2,] 7 5
分類型數據(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用來決定因子的水平是否有次序。
例如一組學生數據:
> y <- c("女","男","男","女","女","女","男")
> (f <- factor(y)) #生成因子
[1] 女 男 男 女 女 女 男
Levels: 女 男
> levels(f) #提取因子的水平
[1] "女" "男"
假若要表示因子之間有大小順序(考慮因子之間的順序),則能夠利用ordered()函數產生。
> score <- c("B","C","D","B","A","D","A")
> (score_o <- ordered(score,levels=c("D","C","B","A"))) #生成有序因子
[1] B C D B A D A
Levels: D < C < B < A
向量、矩陣和數組的元素都單元必須是同一類型的數據。若是一個數據對象須要含有不
同的數據類型,能夠採用列表(list)這種數據對象的形式(數據對象形式)。列表是一個對
象的有序集合構成的對象,列表中包含的對象又稱爲它的份量(components),份量能夠
是不一樣的模式或類型,如一個列表能夠包括數值向量、邏輯向量、矩陣、字符、數組等。創
建列表的函數是list(),其句法是:list(變量1=份量1,變量2=份量2,….)。
例如:下面是某校部分學生的狀況,其中,x、y、z分別表示班級、性別和成績。
>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
l 若要訪問列表的某一成分,能夠用LST[[1]],LST[[2]]的形式訪問,要訪問第二個份量的前三
個元素能夠用LST[[2]][1:3]:
> LST[[3]] #返回列表的第三個成分的值
[1] 80 85 92 76 61 95 83
> LST[[2]][1:3] #返回列表第二個成分的第1到3元素
[1] "女" "男" "男「
因爲份量能夠被命名,這時,咱們能夠在列表名稱後加$符號,再寫上成分名稱來訪問列
表份量。其中成分名能夠簡寫到能夠與其它成分可以區分的最短程度,如LST$sc與LS
T$score表示一樣的份量。例如:
> LST$score #返回socre值
[1] 80 85 92 76 61 95 83
> LST$sc #返回socre值
[1] 80 85 92 76 61 95 83
l 函數length()、mode()、names()能夠分別返回列表的長度(份量的數目)、數
據類型、列表裏成分的名字。
l 在這裏要注意LST[[1]]和LST[1]的差異,[[…]]是選擇單個元素的操做符,而[…]是一個通常
通用的下標操做符。所以前者獲得的是LST中的第一個對象,而且包含份量名字的命名列
表中的份量名字會被排除在外的1;然後者獲得的則是LST中僅僅由第一個元素構成的子
列表。
一、數據框的生成
數據框(data frame)是一種矩陣形式的數據,但數據框中各列能夠是不一樣類型的數據
。數據框每列是一個變量,每行是一個觀測。數據框能夠當作是矩陣(matrix)的推廣,也
能夠看做是一種特殊的列表對象(list)。數據框是R語言特有的數據類型,也是進行統計分
析最爲有用的數據類型。不過對於可能列入數據框中的列表有以下一些限制:
l 份量必須是向量(數值,字符,邏輯),因子,數值矩陣,列表或者其餘數據框。
l 矩陣,列表和數據框爲新的數據框提供了儘量多的變量,由於它們各自擁有列、元素或者
變量。
l 數值向量、邏輯值、因子保持原有格式,而字符向量會被強制轉換成因子而且它的水平就是
向量中出現的獨立值。
l 在數據框中以變量形式出現的向量結構必須長度一致,矩陣結構必須有同樣的行數。
R語言中用函數data.frame ( )生成數據框,其句法是:
data.frame(..., row.names = NULL, check.rows = FALSE, ...)
數據框的列名默認爲變量名,也能夠對列名、行名進行從新命名。例如:
> (student <- data.frame(class=x,sex=y,score=z))
class sex score
1 1 女 80
2 1 男 85
3 2 男 92
4 2 女 76
5 3 女 61
6 3 女 95
7 3 男 83
> (student <- data.frame(x,y,z))
x y z
1 1 女 80
2 1 男 85
3 2 男 92
4 2 女 76
5 3 女 61
6 3 女 95
7 3 男 83
固然,咱們也能夠對數據框的行名進行修改,例如:
> row.names(student) <- c("王x","張x","趙x","劉x","黃x","孫x","李x")
> student
class sex score
王x 1 女 80
張x 1 男 85
趙x 2 男 92
劉x 2 女 76
黃x 3 女 61
孫x 3 女 95
李x 3 男 83
二、數據框的引用
l 以數組形式訪問。數據框能夠看做是特殊的數組。數組是儲存數據的有效方法,能夠按行或
列訪問,就像電子表格同樣,但輸入的數據必須是同一類型。數據框能夠看做數組是由於數
據框的列表示變量、行表示樣本觀察數,所以咱們能夠訪問指定的行或列。
例如:
> student[,"score"] #返回y變量的全部樣本觀察數
[1] 80 85 92 76 61 95 83
> student[,3]
[1] 80 85 92 76 61 95 83
> student[1:5,1:3] #返回第1至第5行,第1至第3列的觀察數
> student[,] #返回全部行全部列數據
二、數據框的引用
l 以列表形式訪問數據框。列表比數據框更爲通常、更爲普遍。列表是對象的集合,並且這些
對象能夠是不一樣類型的。數據框是特殊的列表,數據框的列看做向量,並且要求是同一類型
對象。以列表形式訪問數據框,只要在列表名稱後面加$符號,再寫上變量名便可。例如:
> student$score
[1] 80 85 92 76 61 95 83
除了用$形式訪問外,還能夠用列表名[[變量名(號)]]形式訪問:
> student[["score"]]
[1] 80 85 92 76 61 95 83
> student[[3]]
[1] 80 85 92 76 61 95 83
二、數據框的引用
還能夠篩選出符合咱們條件的數據,好比對上面的數據要獲得成績大於80分的學生,可
以按以下的方法獲得。例如:
> student[student$score>80,]
class sex score
張x 1 男 85
趙x 2 男 92
孫x 3 女 95
李x 3 男 83
三、數據框綁定Attach()函數
數據框的主要用途是保存統計建模的數據。R軟件的統計建模功能都須要以數據框爲輸入
數據。可把數據框當成一種矩陣來處理。在使用數據框的變量時能夠用「數據框名$變量名」
的記法。但這樣使用較麻煩,R軟件提供了attach()函數能夠把數據框中的變量「連接」到內
存中,將數據框「鏈接(綁定)」入當前的名字空間,從而能夠直接用數據框中的變量名訪
問而沒必要用「數據框名$變量名」這種格式。要取消鏈接,用函數detach()便可。
三、數據框綁定Attach()函數
例如上面student數據框有三個變量,對於數據框裏的變量咱們不能直接引用,能夠用「
數據框名$變量名」的格式,或是利用attach( )把數據框「鏈接(綁定)」入當前的名字空間。
> score
錯誤: 找不到對象'score'
> student$score
[1] 80 85 92 76 61 95 83
> attach(student)
> score
[1] 80 85 92 76 61 95 83
要取消鏈接,用函數detach()便可。