1. 程式人生 > >R語言學習筆記(1):R是什麼

R語言學習筆記(1):R是什麼

  1. R初窺

從CRAN(The Comprehensive R Archive Network)cran.r-project.org—mirrors.html中選擇一個映象,然後下載合適的安裝包(R支援Linux、Mac OS X和Windows)。

安裝並執行R後,可以看到R的控制檯(我的作業系統是Mac OS):
這裡寫圖片描述

在R的控制檯輸入如下命令:

install.packages(‘quantmod’) # 安裝quantmod包
require(quantmod) #引用quantmod包
getSymbols(“GOOG”,src=”yahoo”,from=”2013-01-01”, to=’2013-04-24’) #從雅虎財經獲取google的股票資料
chartSeries(GOOG,up.col=’red’,dn.col=’green’) #顯示K線圖 > addMACD() #增加MACD圖
就能夠看到下圖的效果了:

這裡寫圖片描述

最後,退出R:

q()#Terminate an R Session
2. R是什麼

是不是很神奇?反正當時我完全被Hold住了。

那麼R到底是什麼?或者說,R到底是做什麼用的?從不同的角度出發,對R會有不同的描述。

從使用角度,R是一個有著統計分析功能及強大作圖功能的軟體,在GNU協議General Public Licence4下免費發行。

從程式設計角度,R語言是面向物件的統計程式語言,是由AT&T貝爾實驗室所創的S語言發展出的一種方言。

從計算角度,R 是一種為統計計算和圖形顯示而設計的語言及環境。

從開發角度,R 是一組開源的資料操作,計算和圖形顯示工具的整合包有各種方式可以進行程式設計呼叫。

從架構角度,R 是為統計計算和圖形展示而設計的一個系統。它包括一種程式語言,高級別圖形展示函式,和其它語言的介面以及除錯工具。

如果一定要找到一個與R類似的軟體,那就是商業軟體Matlab。R和Matlab都是基於程式設計進行資料分析的工具,Matlab適用的領域更廣,而R更擅長統計分析領域。

與Matlab相比,R更具備開放性:

R是自由軟體,Matlab是商業軟體;

R可以方便的通過“包”進行擴充套件,R的核心只有25個包,但是有幾千個外部包可以呼叫,當然你也可以開發自己的;

R語言比Matlab的要強大;

R和其他程式語言/資料庫之間有很好的介面;其他語言也可以很方便的呼叫R的API和結果物件。

R常用於金融和統計領域。大多數人使用R就是因為它的統計功能,R的內部實現了很多經典的or時髦的統計技術。

這裡寫圖片描述

  1. R的核心概念

3.1 物件

R語言是一種面向物件的語言,所有的物件都有兩個內在屬性:元素型別和長度。

元素型別是物件內元素的基本型別,包括:數值(numeric),字元型(character),複數型(complex)、邏輯型(logical)、函式(function)等,通過mode()函式可以檢視一個物件的型別。

長度是物件中元素的數目,通過函式length()可以檢視物件的長度。

除了元素型別外,物件本身也有不同的“型別”,表示不同的資料結構(struct)。R中的物件型別主要包括:

向量(vector): 由一系列有序元素構成。

因子(factor):對同長的其他向量元素進行分類(分組)的向量物件。R 同時提供有序(ordered)和無序(unordered)因子。

陣列(array):帶有多個下標的型別相同的元素的集合

矩陣(matrix):矩陣僅僅是一個雙下標的陣列。R提供了一下函式專門處理二維陣列(矩陣)。

資料框(data frame):和矩陣類似的一種結構。在資料框中,列可以是不同的物件。

時間序列(time series):包含一些額外的屬性,如頻率和時間.

列表(list):是一種泛化(general form)的向量。它沒有要求所有元素是同一型別,許多時候就是向量和列表型別。列表為統計計算的結果返回提供了一種便利的方法。

3.2 常量

R中還定義了一些常量,比如:

NA:表示不可用

Inf: 無窮

-Inf: 負無窮

TRUE:真

FALSE:假

  1. R的基本使用

4.1 命令

R是一種語法非常簡單的表示式語言(expression language)。使用者通過命令(command)與R進行互動。

基本命令要麼是表示式(expressions)要麼就是賦值(assignments)。如果一條命令是表示式,那麼它將會被解析(evaluate),並將結果顯示在螢幕上,同時清空該命令所佔記憶體。賦值同樣會解析表示式並且把值傳給變數但結果不會自動顯示在螢幕上。

基於命令,可以用互動的方式或者批處理/指令碼檔案的方式使用R。

4.2 互動式使用 R

互動式shell是一種很方便的環境,可以進行各種嘗試,隨時調整過程。與Python、Ruby等語言一樣,R也提供了shell環境。本文開始的例子就是以互動的方式使用R。當開啟R控制檯時,R會顯示命令提示符”>”,此時可以輸入命令。

下面是互動式使用R的幾個例子:

例一:

> help.start() #啟動線上幫助,會開啟瀏覽器。 
> x <- rnorm(50); y <- rnorm(x)  #產生兩個隨機向量x和y 
> plot(x,y) #使用x,y畫二維散點圖, 會開啟一個圖形視窗 
> ls() #檢視當前工作空間裡面的 R 物件 
> rm(x,y) #清除x,y物件 
>x <- 1:20  # 相當於x=(1,2,…,20) 

例二:

x <- 1:20#等價於 x = (1, 2, ..., 20)。  
w <- 1 + sqrt(x)/2#標準差的`權重'向量。  
dummy <- data.frame(xx=x, y= x + rnorm(x)*w)#建立一個由x 和 y構成的雙列資料框 
dummy #檢視dummy物件中的資料。  
fm <- lm(y ~ x, data=dummy)#擬合 y 對 x 的簡單線性迴歸 
summary(fm)#檢視分析結果。  
fm1 <- lm(y ~ x, data=dummy, weight=1/w^2)#加權迴歸 
summary(fm1)#檢視分析結果。 
attach(dummy)#讓資料框中的列項可以像一般的變數那樣使用。  
lrf <- lowess(x, y)#做一個非參區域性迴歸。  
plot(x, y)#標準散點圖。  
lines(x, lrf$y)#增加區域性迴歸曲線。  
abline(0, 1, lty=3)#真正的迴歸曲線:(截距 0,斜率 1)。  
abline(coef(fm))#無權重回歸曲線。  
abline(coef(fm1), col = "red")#加權迴歸曲線。 detach()#將資料框從搜尋路徑中去除。 
plot(fitted(fm), resid(fm), xlab="Fitted values", ylab="Residuals", main="Residuals vs Fitted")一個檢驗異方差性(heteroscedasticity)的標準迴歸診斷圖。 
qqnorm(resid(fm), main="Residuals Rankit Plot")#用正態分值圖檢驗資料的偏度(skewness),峰度(kurtosis)和異常值(outlier)。 
rm(fm, fm1, lrf, x, dummy)#再次清空。 

例三: Michaelson 和 Morley 測量光速的經典實驗

filepath <- system.file("data", "morley.tab" , package="datasets")#從物件 morley 中得到實驗資料的檔案路徑 

filepath#檢視檔案路徑 

file.show(filepath)#檢視檔案內容 

mm <- read.table(filepath)#以資料框的形式讀取資料 

mm$Expt <- factor(mm$Expt) 

mm$Run <- factor(mm$Run)#將 Expt 和 Run 改為因子。  

attach(mm)#讓資料在位置 3 (預設) 可見(即可以直接訪問)。  

plot(Expt, Speed, main="Speed of Light Data", xlab="Experiment No.")#用簡單的盒狀圖比較五次實驗。  

fm <- aov(Speed ~ Run + Expt, data=mm)#分析隨機區組,`runs'`experiments' 作為因子。  

summary(fm) 



fm0 <- update(fm, . ~ . - Run) 

anova(fm0, fm)#擬合忽略 `runs' 的子模型,並且對模型更改前後進行方差分析。  

detach() 

rm(fm, fm0)#在進行下面工作前,清空資料。 

下面是等高線和影像顯示的示例

x <- seq(-pi, pi, len=50)#x 是一個在區間 [-pi\, pi] 內等間距的50個元素的向量 

y <- x 



f <- outer(x, y, function(x, y) cos(y)/(1 + x^2))#f 是一個方陣,行列分別被 x 和 y 索引,對應的值是函式 cos(y)/(1 + x^2) 的結果。  

oldpar <- par(no.readonly = TRUE) 

par(pty="s")#儲存圖形引數,設定圖形區域為“正方形”。  

contour(x, y, f) 

contour(x, y, f, nlevels=15, add=TRUE)#繪製 f 的等高線;增加一些曲線顯示細節。  

fa <- (f-t(f))/2#fa 是 f 的“非對稱部分”(t() 是轉置函式)。  

contour(x, y, fa, nlevels=15)#畫等高線 

par(oldpar)# 恢復原始的圖形引數 

image(x, y, f) 

image(x, y, fa)#繪製一些高密度的影像顯示 

objects();  

rm(x, y, f, fa)#在繼續下一步前,清空資料。 



th <- seq(-pi, pi, len=100) 

z <- exp(1i*th)#1i 表示複數 i 



par(pty="s") 

plot(z, type="l")#圖形引數是複數時,表示虛部對實部畫圖。這可能是一個圓。  

w <- rnorm(100) + rnorm(100)*1i#假定我們想在這個圓裡面隨機抽樣。一種方法將讓複數的虛部和實部值是標準正態隨機數 ...  

w <- ifelse(Mod(w) > 1, 1/w, w)#將圓外的點對映成它們的倒數。  

plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+",xlab="x", ylab="y") 

lines(z)#所有的點都在圓中,但分佈不是均勻的。  



#下面採用均勻分佈。現在圓盤中的點看上去均勻多了。  

w <- sqrt(runif(100))*exp(2*pi*runif(100)*1i) 

plot(w, xlim=c(-1,1), ylim=c(-1,1), pch="+", xlab="x", ylab="y") 

lines(z) 

rm(th, w, z)#再次清空。  

q()#離開 R 程式 

4.3 工作空間(workspace)

R shell 可以任意地儲存一個完整的環境,稱為工作空間(workspace)。前面的例子中,執行q()命令退出R時,會被詢問是否要儲存工作空間:

這裡寫圖片描述

工作空間(workspace)儲存了一些環境資訊。每次與R的會話(session)可以從一個全新的環境開始,也可以在原來的基礎上繼續,這些執行資訊就儲存在工作空間中。

如果在UNIX系統以命令列的方式啟動R,則當前目錄就是本次會話的工作空間:

$ mkdir r_test

$ cd r_test/

$ R

看看R能為工作空間儲存些什麼內容:

x <- rnorm(50); y <- rnorm(x) #產生兩個隨機向量x和y

q()

Save workspace image? [y/n/c]: y

$ ls -Al

會發現R儲存了兩個隱藏檔案:.RData和.Rhistory。其中.RData以二進位制的方式儲存了會話中的變數值,.Rhistory以文字檔案的方式儲存了會話中的所有命令。

如果在一個已有的工作空間中啟動R,會提示:

[原來儲存的工作空間已還原]

此時可以用函式ls()和history()看到之前儲存的資料和命令。

使用rm()/remove()可以刪除工作空間中的變數。

在R控制檯,也可以使用函式getwd()和setwd()來獲取/設定工作空間目錄;使用list.files()檢視當前目錄下的檔案。

如果以GUI方式執行R控制檯,可以通過選單來載入或儲存工作空間。

4.4 指令碼/批處理

前面提到R可以在工作空間中儲存歷史命令。其實這就是一個工作空間中的預設指令碼,當載入工作空間時自動執行。

我們完全可以寫自己的指令碼,指定R批量執行一些命令。通常,自己的指令碼會以“.R”作為副檔名。一個最簡單的例子test.R:

x <- rnorm(50); y <- rnorm(x) #產生兩個隨機向量x和y

plot(x,y) #使用x,y畫二維散點圖, 會開啟一個圖形視窗

並儲存到工作空間,然後在R控制檯,使用命令:

source(‘test.R’)

就可以執行該指令碼。

source(‘test.R’, echo=TRUE)可以讓指令碼執行時輸出更詳細的資訊。

編寫指令碼自動執行一些任務時,sink()函式會比較有用:

sink(“record.lis”)

會把所有後續的輸出結果從控制檯重定向到外部檔案 record.lis 中,此時控制檯中看不到命令輸出的結果。使用命令:

sink()

可以讓輸出流重新定向到控制檯。

  1. 幫助系統

GNU軟體通常都會有非常好的幫助系統,無論對於初學者還是熟練者都能帶來很大的幫助。R當然也不例外。R中提供的幫助主要有以下幾種:

5.1 文件和搜尋

help.start() 命令會開啟瀏覽器,顯示幫助文件。包括一些入門的文件,以及搜尋功能(連結:Search Engine & Keywords)。
這裡寫圖片描述

5.2 演示

demo()會按照包分組,列出所有可用的演示:
這裡寫圖片描述

按照名稱可以開始演示,如:

demo(is.things)

5.3 函式幫助

如果已經知道一個函式的名稱(比如solve),需要了解其所屬的包、用途、用法、引數說明、返回值、參考文獻、相關函式以及範例等,可以使用命令

help(solve)或 ?solve

該命令會彈出一個視窗:

這裡寫圖片描述

5.4 函式示例

對於函式,還可以使用example()執行示例,比如:

example(solve)

5.5 關鍵字和運算子

與函式的幫助類似,但是需要加上引號,如:

? ‘[[’ # 等價於 help(‘[[‘)

?’+’ #等價於 help(‘+’)

?’if’ #等價於 help(‘if’)

5.6 搜尋

如果不知道函式名稱,還可以進行搜尋,比如:

??’analysis’ #等價於 search(‘analysis’)

這裡寫圖片描述

5.7 官方搜尋

前面的幫助都受限於本地環境已經安裝的包。如果要搜尋R中所有的資源(包,函式、數學方法等),需要在R的官方網站搜尋:

www.r-project.org—search.html

  1. 學習資料

www.R-project.org R官方網站

cran.r-project.org—manuals.html 官方網站上的一些手冊和文件(必看)

staff.washington.edu—Rcourse 華盛頓大學的一個R教程