R 是一門擁有統計分析及作圖功能的免費軟體,主要用於數學建模、統計計算、數據處理、可視化等方向。據 IEEE Spectrum發佈的2016年編程語言前10位排名來看,R語言由2015年排名第6位上升級2016年的第5位。目前在CRAN 上發佈的演算法包已經超過8000+多個。R體系涉及到高等數據、概 ...
R 是一門擁有統計分析及作圖功能的免費軟體,主要用於數學建模、統計計算、數據處理、可視化等方向。據 IEEE Spectrum發佈的2016年編程語言前10位排名來看,R語言由2015年排名第6位上升級2016年的第5位。目前在CRAN 上發佈的演算法包已經超過8000+多個。R體系涉及到高等數據、概率學、統計學、IT技術等多種知識的綜合應用,雖然看起來超級複雜,但學過程還是得從基礎開始。
解釋:CRAN (The Comprehensive R Archive NetWork): 提供下載軟體安裝程式和相應軟體包的網站,訪問地址:https://www.r-project.org/
(附圖2016年編程語言排名:來源於 http://spectrum.ieee.org/static/interactive-the-top-programming-languages-2016)
目錄:
- R語言特點
- R語法規範
- R工作原理
- R數據類型
- R對象類別
- R對象判斷轉換
- R運算符
- R特殊值
- R迴圈語句
- R工作空間
- R幫助
R語言特點:
- 靈活、開發、免費
- R是一種解釋性語言
- R區分大小寫
- 幫助系統很贊,開發查找方便
- 數量眾多的演算法功能包(8000+擴展包),還不包括在github上的開發包
- 支持在UNIX、 Windows and MacOS多種系統上運行
- 高質量、廣泛的統計分析、數據挖掘
R語法規範:
- 對象的命名以"."或字母開頭,當以"."開頭時,第二個字元不允許是數字
- 基本命令要麼是表達式,要麼是賦值。如果命令是表達式,它被解析後,結果顯示在屏幕同時清空命令所占記憶體。賦值被解析後,將值傳給變數結果不顯示。
- 命令以";"分隔或另起一行,註釋以"#"標註
- 當一條命令在一行結束時還沒不完整,R會結出延續提示符,預設是"+"
- 與其它語言相比,R有個比較個性的賦值表達方式(即箭頭賦值符號),至於此表達方式的來源,在謝老師的一篇文章中有介紹,請參見 (http://yihui.name/cn/2012/09/equal-and-arrow/)
- 開發過程中的編碼規範約定,可參見google的R語言編碼風格指南,如下圖(詳細參見:http://bbs.pinggu.org/thread-1410518-1-1.html)
R工作原理:
- 當R在運行時,所有的變數、數據、函數及結果都是以對象的形式存在於電腦的活動記憶體中,期間進行的所有操作都是針對活動記憶體中的對象,如下示意圖
- 用戶通過輸入一些命令調用函數,分析得出的結果可以直接顯示在屏幕上,也可以直接存入某個對象或寫入磁碟,因為產生的數據本身就是一種對象,所以它們也能被視為數據並能象其它數據一樣被處理分析。數據的輸入文件可來源於本地磁碟,也可以是從遠程服務端獲取
- 上圖中示意的所有的R 函數都包含在某個庫里 (library), 我們從CRAN上下載的程式包被調用的時候,都要通過 library(包名)先載入到記憶體,再被使用,後面會詳細介紹。
- 在R軟體安裝包里自帶的 base 庫是R的核心,在啟動R時會自動載入,它包含瞭如:數據讀寫、數據運算等基本操作。
R數據類型:
- 數據型:Numeric
- 字元型:Character
- 邏輯型:Logical
- 因數型:Factor (表示不同類別,在下麵的內容中會舉例來說明)
- 複數型:Complex
R對象類別:
- 向量(Vector): 線性代數裡面我記得又稱為矢量,它表示一系統元素的組合。(註意:向量裡面的元素類型必須一致,不一致時會自動進行轉換),如下圖示例
- 因數(Factor): 為處理分類數據提供的一種有效方法,概念難懂,結合以下代碼說明
#取10名考生所在的省賦給變數province province <- c('四川','湖南','江蘇','四川','四川','四川','湖南','江蘇','湖南','江蘇') #創建因數, 並查看因數輸出結果 pf <- factor(province);pf #錄入每位考生的分數 score <- c(95,86,84,92,84,79,86,99,85,90) #計算各省的平均成績,併在屏幕顯示 tapply(score,pf,mean)
-
輸出結果如下圖:(這樣應該能明白了吧?)
- 矩陣(matrix): 一種特殊的數組,是向量在多維度下的一般形式。 用法: matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
- data為必要的矩陣元素,nrow 為行數,ncol 為列數,註意nrow 與ncol 的乘積應為 矩陣元素個數,byrow 項控制排列元素時是否按行進行,預設是按列,dimnames 給定行和列的名稱
- 示例代碼: 1:12表示 1至12 的有序數字序列
> matrix(1:12,nrow = 3,ncol = 4,byrow = TRUE,dimnames = list(c("Row1","Row2","Row3"),c("col1","col2","col3","col4"))) col1 col2 col3 col4 Row1 1 2 3 4 Row2 5 6 7 8 Row3 9 10 11 12 >
- 數據框(dataframe): 和矩陣類似的結構,列可以是不同的對象。
- 使用data.frame函數來初始化一個對象,示例代碼如下:
> duty <-data.frame(date=c("20160814","2016015","2016016"), + Name=c("tgzhu","zhangShan","LiShi"), + Tel=c("13606401549","13606401550","13606401551")) > duty date Name Tel 1 20160814 tgzhu 13606401549 2 2016015 zhangShan 13606401550 3 2016016 LiShi 13606401551 >
-
在通過讀取本地文件、通過RODBC訪問資料庫訪問的都是 data.frame對象,在後續會以單獨的章節對其包含的操作進行介紹
- 列表(list): 一種泛化的向量,沒有要求所有元素數型一致
- 通過 list 函數來初始化一個對象,示例代碼如下:
#無tag 方式 list("tgzhu",16,TRUE) #帶tag方式 list(name="tgzhu",workAge=16,goodMan=TRUE) #list 嵌套 list(name="tgzhu",workAge=16,address=list(address="JN",Tel="13606401550"))
-
list中元素的訪問:list_name$tag_name、list_name[[tag_name]]、 list_name[[index]]
- 註意:list中元素的訪問需要雙層[[]],如果單層[index]或[tag_name]會訪問到tag_name(或者index)與值本身,是個子list,而不僅僅是值;
- 雙層[[]]中的只能是單一的tag_name或index,不能是類似[[1:3]]這樣訪問,而單層可以[1:3],提取出1~3作為子list
- 小結:
- R中的數據結構主要面向《線性代數》中的一些概念,如向量、矩陣等
- R中其實沒有簡單數據(數值型、邏輯型、字元型等),對於簡單類型會自動看做長度為1的向量
R對象判斷轉換:
- R對象判斷函數:其返回值:TRUE或FALSE
- is.numeric(): 是否數值型數據
- is.character(): 是否字元型數據
- is.vector(): 是否向量數據
- is.matrix(): 是否矩陣數據
- is.data.frame(): 是否數據框數據
- is.factor(): 是否因數數據
- is.logical(): 是否邏輯型數據
- 轉換數據類型:函數將輸入參數轉換為對應的類型
- as.numeric()
- as.character()
- as.vector()
- as.matrix()
- as.data.frame()
- as.factor()
- as.logical()
- 簡單示例如下
> a <- c(1,2,3);a [1] 1 2 3 > > is.numeric(a) [1] TRUE > > a<-as.character(a);a [1] "1" "2" "3" > > is.numeric(a) [1] FALSE
R運算符:
- 算術運算符: + - * /
- 邏輯運算符: <,<=,>,>=,==,!=, &, |, !
- 數學函數:
log,exp,sin,cos,tan,sqrt,max ,min,range,length,sum,prod,var
R迴圈語句:
- 條件語句:
if (expr1 ) expr2 else expr3
- 迴圈控制:for,repeat,while
for語法: for (name in expr1 ) expr2 其中name 是迴圈變數,expr1是一個向量表達式,而expr2常常是根據虛擬變數name 而設計的成組表達式。在name 訪問expr1所有可以取到的值時,expr2都會運行
- 註意:相比其他程式語言,R代碼裡面很少使用for(),執行效率很低
- repeat expr, while (condition) expr
- 關鍵字break:可以用於結束任何迴圈,甚至是非常規的。它是結束repeat 迴圈的唯一辦法。
- 關鍵字next:可以用來結束一次特定的循環,然後直接跳入"下一次"迴圈
R特殊值:
- 在某些情況下,向量的元素可能有殘缺.R為確保所有數據都能被正確識別、計算或統計等,定義了一些特殊值數據
- NULL:空數據
- NA(not available):表示無數據
- NaN(Not a Number):表示非數字
- inf:數字除以0得到的值,無窮大
- 斷一個object (x)是不是屬於這些類型有相應的函數:
- is.null(x)
- is.na(x)
- is.nan(x)
- is.infinite(x)
R工作空間:
- 工作空間(workspace)就是當前R的工作環境,它儲存著所有用戶定義的對象(向量、矩陣、函數、數據框、列表) 。在一個R會話結束時,你可以將當前工作空間保存到一個鏡像中,併在下次啟動R時自動載入它
- 當前的工作目錄(working directory)是R用來讀取文件和保存結果的預設目錄。使用函數getwd()來查看當前的工作目錄,或使用函數setwd()設定當前的工作目錄。
- 註意:如果需要讀入一個不在當前工作目錄下的文件,則需在調用語句中寫明完整的路徑。記得使用引號閉合這些目錄名和文件名
- 用於管理工作空間的部分標準命令:
- getwd(): get working directory 顯示當前的工作目錄
- setwd("yourdirectory"): 修改當前的工作目錄為你指定的目錄地址
- ls(): 列出當前工作空間中的對象
- rm(objectlist): 移除(刪除)一個或多個對象,變通一下: rm(list=ls()) 即表示刪除工作空間記憶體中的所有對象
- rm(list=ls(pat=“^m”)): 刪除記憶體中以m開頭的變數
- options(): 顯示或設置當前選項,這個命令很有用,在下麵的章節會用到
- save.image("myfile") : 保存工作空間到文件myfile中(預設值為.RData)
- save(objectlist, file="myfile"): 保存指定對象到一個文件中
- load("myfile"): 讀取一個工作空間到當前會話中(預設值為.RData),一些表態的數據文件也可保存為.rdaa文件,通過load載入到記憶體
- q(): 退出R
R幫助:
- help.start(): 打開所有已在本地安裝的幫助文檔
- help( 函數名) 或 ? 函數名 : 查看函數幫助文檔
- help.search(“pattern”) 或 ??pattern: 函數搜索已在本地電腦安裝的幫助文檔
- 如果有些包是最近才安裝的,則設置rebuild參數來刷新資料庫,如:help.search(‘tree’,rebuild=TRUE)
- 示例:help(“bs”,try.all.package=TRUE) : 預設情況下,help只會在載入記憶體的包中進行搜索,選項 try.all.package = FASLSE,若設為TRUE,則可在所有包中進行搜索。在 這種情況下,不會顯示函數 的幫助頁面
- 若package未載入記憶體,而想查看幫助頁面,可使用:help(“bs”,package=“splines”);
- apropos("yourSearchName"):找出所有名字中含有指定字元串的函數(僅載入到記憶體中的包中搜)