RHadoop環境的搭建基礎

前言

覆蓋R基礎知識,快速上手,RHadoop環境的搭建基礎課。

目錄

  1. 背景知識
  2. 開發環境
  3. R語法
  4. R基本函數
  5. R的擴展包

1. 背景知識

R起源

R 是一個有著統計分析功能及強大作圖功能的軟體系統,是由奧克蘭大學統計學系的Ross Ihaka和Robert Gentleman 共同創立。由於R 受Becker, Chambers & Wilks 創立的S 和Sussman 的Scheme兩種語言的影響,所以R 看起來和S 語言非常相似。

R 是一個世界範圍統計工作者共同協作的產物,至2013 年2 月共計近5000 個包可在互聯網上自由下載,這些都是各行業數據分析同行的工作結晶。

R的特點

  1. 有效的數據處理和保存機制。
  2. 擁有一整套數組和矩陣的操作運算符。
  3. 一系列連貫而又完整的數據分析中間工具。
  4. 圖形統計可以對數據直接進行分析和顯示,可用於多種圖形設備。
  5. 一種相當完善、簡潔和高效的程序設計語言。它包括條件語句、循環語句、用戶自定義的遞歸函數以及輸入輸出介面。
  6. R語言是徹底面向對象的統計編程語言。
  7. R語言和其它編程語言、資料庫之間有很好的介面。
  8. R語言是自由軟體,可以放心大膽地使用,但其功能卻不比任何其它同類軟體差。
  9. R語言具有豐富的網上資源

R的下載和安裝

R是一個免費的自由軟體,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免費下載和使用的,在那兒可以下載到R的安裝程序、各種外掛程序和文檔。在R的安裝程序中只包含了8個基礎模塊,其他外在模塊可以通過CRAN獲得。

R的官方網站: The R Project for Statistical Computing

Linux Ubuntu的R安裝

~ sudo vi /etc/apt/sources.listndeb http://mirror.bjtu.edu.cn/cran/bin/linux/ubuntu precise/nn~ sudo apt-get updaten~ sudo apt-get install r-base-core=2.15.3-1precise0precise1n

2. 開發環境

R命令行環境:

R默認的界面環境:

RStudio的IDE開發環境: Home

3. R語法

R是一種語法非常簡單的表達式語言(expression language),大小寫敏感。

可以在R 環境下使用的命名字符集依賴於R 所運行的系統和國家(系統的locale 設置),允許數字,字母,「.」,「_」

1). 命名

命名必須以」.」或者字母開頭,以」.」開頭時第二個字元不允許是數字。

2). 基本命令

基本命令要麼是表達式(expressions),要麼就是賦值(assignments)。

  • 表達式,命令將被解析,並將結果顯示在屏幕上,同時清空該命令所佔內存。
  • 賦值,命令將被解,並把值傳給變數,但結果不會自動顯示在屏幕上。

命令可以被」;」隔開或者另起一行。基本命令可以通過大括弧{},放在一起構成一個複合表達式。

注釋:一行中以井號」#」開頭

換行:如果一條命令在一行結束的時候在語法上還不完整,換行提示符,默認是+

3). 基本的對象

R創建和控制的實體被稱為對象。它們可以是變數,數組,字元串,函數,或者其他通過這些實體定義的一般性的結構。

  • 矩陣(matrix)或者更為一般的數組(array)是多維的廣義向量。實際上,它們就是向量,而且可以同時被兩個或者更多個索引引用,並且以特有的方式顯示出來。
  • 因子(factor)為處理分類數據提供的一種有效方法。
  • 列表(list)是一種泛化(general form)的向量。它沒有要求所有元素是同一類型,許多時候它本身就是向量和列表類型。列表為統計計算的結果返回提供了一種便利的方法。
  • 數據框(data frame)是和矩陣類似的一種結構。在數據框中,列可以是不同的對象。可以把數據框看作是一個行表示觀測個體並且(可能)同時擁有數值變數和分類變數的`數據矩陣』 。許多實驗數據都可以很好的用數據框描述:處理方式是分類變數而響應值是數值變數。
  • 函數(function)是可以保存在項目工作空間的R 對象。該對象為R 提供了一個簡單而又便利的功能擴充方法。見編寫你自己的函數

在R會話過程中,對象是通過名字創建和保存的。objects(), ls()可以顯示當前會話的對象名字。rm()可以刪除對象。

對象持久化

R 會話中創建的所有對象可以永久地保存在一個文件中以便於以後的R 會話調用。在每一次R 會話結束的時候,你可以保存當前所有可用的對象。如果你想這樣做,這些對象將會寫入當前目錄下一個叫.RData的文件中,並且所有在這次會話中用過的命令行都會被保存在.Rhistory 的文件中。當R 再次在同一目錄下啟動,這些對象將從這個文件中重新導入工作空間。同時,相關的歷史命令文件也會被導入。

4). 向量和賦值

向量是由一串有序數值構成的序列

x <- c(10.4, 5.6, 3.1, 6.4, 21.7)n

函數c()完成的賦值語句。這裡的函數c() 可以有任意多個參數,而它返回的值則是一個把這些參數首尾相連形成的向量。

賦值也可以用函數assign()實現。

assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))n

賦值符<-,->可以看作是該命令一個語義上的縮寫。

c(10.4, 5.6, 3.1, 6.4, 21.7) -> xn

向量運算

在算術表達式中使用向量將會對該向量的每一個元素都進行同樣算術運算。

出現在同一個表達式中的向量最好是長度一致。如果他們的長度不一樣,該表達式的值將是一個和其中最長向量等長的向量。

表達式中短的向量會被循環使用以達到最長向量的長度。

對於一個常數就是簡單的重複。

v <- 2*x + y + 1n

邏輯向量

邏輯向量元素可以被賦予的值,有TRUE,FALSE 和NA 邏輯向量可以由條件式(conditions)產生 temp <- x > 13

字元向量

字元向量就是字元串,可以用雙引號和單引號作分割符。

paste():可以把單獨的字元連成字元串,可以有任意多的參數。參數中的任何數字都將被顯式地強制轉換成字元串,而且以同樣的方式在終端顯示。默認的分隔符是單個的空格符。

修改分隔符換成」「

labs <- paste(c("X","Y"), 1:10, sep="")n

索引向量:通過索引值可以選擇和修改一個數據集的子集

一個向量的子集元素可以通過向量名後面的方括弧中加入索引向量得到。如果一個表達式的結果是向量,則我們可以直接在表達式的末尾方括弧中加入索引向量以得到結果向量的子向量.

  • 邏輯向量:索引向量必須和被挑選元素的向量長度一致。向量中對應索引向量元素為TRUE 的元素將會被選中,而那些對應FALSE 的元素則被忽略。

    y <- x[!is.na(x)]n

  • 正整數向量:索引向量必須是1, 2, … , length(x)的子向量。索引向量中索引對應的元素將會被選中,並且在結果向量中的次序和索引向量中的次序一致。這種索引向量可以是任意長度的,結果向量的長度和索引向量完全一致。

    x[1:10]n

  • 負整數向量:這種索引向量指定被排除的元素而不是包括進來。

    y <- x[-(1:5)]n

  • 字元串向量:這可能僅僅用於一個對象可以用names 屬性來識別它的元素。名字向量的子向量可以像上面第二條提到的正整數標籤一樣使用。

    fruit <- c(5, 10, 1, 20) nnames(fruit) <- c("orange」, 「banana」, 「apple」, 「peach」) nlunch <- fruit[c(「apple」,「orange」)]n

  • 5).運算符

    算術運算符:

+ - * / n

邏輯運算符:

<,<=,>,>=,==,!=, &, |, ! n

數學函數:

log,exp,sin,cos,tan,sqrt ,max ,min,range,length,sum,prod,varnn註:var(x): 等價於sum((x-mean(x))^2)/(length(x)-1)n

6). 控制語句

條件語句:if

if (expr1 ) expr2 else expr3n

循環控制:for,repeat,while

for (name in expr1 ) expr2n

其中name 是循環變數,expr1是一個向量表達式,而expr2常常是根據虛擬變數name 而設計的成組表達式。在name 訪問expr1所有可以取到的值時,expr2都會運行。

警告:相比其他程序語言,R代碼裡面很少使用for(),執行效率很低

repeat exprnwhile (condition) exprn

關鍵字break:可以用於結束任何循環,甚至是非常規的。它是結束repeat 循環的唯一辦法。

關鍵字next:可以用來結束一次特定的循環,然後直接跳入"下一次"循環。

7). 生成正則序列

1:30 語句:等價於向量c(1, 2, …, 29, 30) 30:1 語句:可用來產生一個逆向的數列。

seq:數列生成中最為常用的工具。seq(1,30,1) rep:把一個數的完整拷貝多次,保持數列順序req(x,times=5)

8). 缺損值

在某些情況下,向量的元素可能有殘缺. 當一個元素或者值在統計的時候"不可得到"(not available)或者"值丟失" (missing value),相關位置可能會被保留並且賦予一個特定的值NA。 任何含有NA 數據的運算結果都將是NA。 函數is.na(x)返回一個和x同等長度的向量。它的某個元素值為TRUE 當且僅當x中對應元素是NA。

z <- c(1:3,NA); ind <- is.na(z)n

第二種"缺損"值,也稱為非數值NaN(Not a Number)

0/0 或 Infn

9). 對象

內在屬性:模式和長度

R操作的實體是對象。實數或複數向量,邏輯向量和字元串向量之類的對象屬於"原子"型的對象,因為它們的元素都是一樣的類型或模式。R的對象類型包括數值型,複數型,邏輯型,字元型,和原生型。向量必須保證它的所有元素是一樣的模式。因此任何給定的向量必須明確屬於邏輯性,數值型,複數型,字元型或者原生型.

列表是任何模式的對象的有序序列。列表被認為是一種"遞歸"結構而不是原子結構,因為它們的元素可以以它們各自的方式單獨列出。函數和表達式也是遞歸結構。

所有對象都有模式(mode)和長度(length)兩個內在屬性

mode(x),length(x)n

外部屬性

attributes(x):給出對象當前定義的非內在屬性的列表。

attr(object, name): 可以用來設置的外部屬性。

z<-c(1:3,NA) nattr(z, "name") <- "abc" nattributes(z)n

對象的類屬性

R裡面的所有對象都屬於類(class),可以通過函數class(x)查看。

對於簡單的向量,類是對應的模式(mode):"numeric","logical","character" 或者"list"

其他的類型,像"matrix","array","factor" 和"data.frame" 就可能是其他值。

10). 因子(factor)

假定我們有一份來自澳大利亞所有州和行政區的信息樣本 以及他們各自所在地的州名。

state <- c("tas", "sa", "qld", "nsw", "nsw", "nt")n

在字元向量中,"有序"意味著以字母排序的。

創建因子factor:

statef <- factor(state)nstatefn[1] tas sa qld nsw nsw nt nLevels: nsw nt qld sa tasn

levels():可以用來得到因子的水平(levels)。

levels(statef)n[1] "nsw" "nt" "qld" "sa" "tas"n

函數tapply()和不規則數組

為計算樣本中每個州的平均收入,我們可以用函數tapply():

incomes <- c(60, 49, 40, 61, 64, 60)nincmeans <- tapply(incomes, statef, mean)n> incmeansnnsw nt qld sa tas n62.5 60.0 40.0 49.0 60.0n

函數tapply() 可以用來處理一個由多個分類因子決定的向量下標組合。例如,我們可能期望通過州名和性別把這稅務會計師分類。

有序因子

因子的水平是以字母順序排列的,或者顯式地在factor中指定。有時候因子的水平有自己的自然順序並且這種順序是有意義的。ordered()就是用來創建這種有序因子, ordered()和factor 基本完全一樣。

大多數情況下,有序和無序因子的唯一差別在於前者顯示的時候反應了各水平的順序。在線性模型擬合的時候,兩種因子對應的對照矩陣的意義是完全不同的。

11). 數組

數組可以看作是帶有多個下標類型相同的元素集合。

維度向量(dimension vector)是一個正整數向量。如果它的長度為k,那麼該數組就是k-維的。

向量只有在定義了dim屬性後才能作為數組在R中使用。

假定,z是一個含1500個元素的向量

z<-seq(1,1500)n dim(z) <- c(3,5,100)n attributes(z)n $dimn [1] 3 5 100n

對dim 屬性的賦值使得該向量成一個3 ×5 ×100 的數組

數組索引

數組元素可以通過給定數組名及其後方括弧中用逗號隔開的下標訪問。可以根據索引數組去給數組中不規則的元素集合賦值或者將數組中特定的元素返回到一個向量中

array()

除了用設定一個向量dim 屬性的方法來構建數組,它還可直接通過函數array將向量轉換得到.

假定向量h 有24個或更少的數值,那麼命令

h<-seq(1,24)nZ <- array(h, dim=c(3,4,2))n#等價操作ndim(Z) <- c(3,4,2)n

向量和數組混合運算

  • 表達式運算是從左到右進行的
  • 短的向量操作數將會被循環使用以達到其他操作數的長度
  • 有且只有短的向量和數組在一起,數組必須有一樣的屬性dim,否則返回一個錯誤
  • 向量操作數比矩陣或者數組操作數長時會引起錯誤
  • 如果數組結構給定,同時也沒有關於向量的錯誤信息和強制轉換操作,結果將是一個和它的數組操作數屬性dim 一致的數組。

數組的外積

數組一個非常重要的運算就是外積運算(outer product)。如果a 和b 是兩個數值數組,它們的外積將是這樣的一個數組:維度向量通過連接兩個操作數的維度向量得到;數據向量則由a的數據向量元素和b的數據向量元素的所有可能乘積得到。外積是通過特別的操作符%o%實現:

ab <- a %o% bnab <- outer(a, b, "*")n [,1] [,2] [,3]n[1,] 1 2 3n[2,] 2 4 6n[3,] 3 6 9n

命令中的乘法操作符可以被任意一個雙變數函數代替。

x<-c(1,2,3);y<-c(2,3,4)nf <- function(x, y) cos(y)/(1 + x^2)nz <- outer(x, y, f)n

兩個常規向量的外積是一個雙下標的數組(就是矩陣,最大秩為1)。

數組的廣義轉置

函數aperm(a, perm) 可以用來重排一個數組a

B <- aperm(z, c(2,1))n#等價操作nt(z)n

12). 矩陣

矩陣是一個雙下標的數組. R包括許多隻對矩陣操作的操作符和函數。例如上面提到的t(X)就是矩陣的轉置函數。函數nrow(A) 和ncol(A) 將會分別返回矩陣A 的行數和列數。

矩陣相乘

操作符%*% 用於矩陣相乘。

如果A和B是大小一樣的方陣,那麼

A * Bn

將是一個對應元素乘積的矩陣,而

A %*% Bn

則是一個矩陣積。如果x 是一個向量,那麼

x %*% A %*% xn

crossprod():可以完成"矢積"運算,也就是說crossprod(X,y) 和t(X) %*% y 等價,而且在運算上更為高效。

diag():返回以該向量元素為對角元素的對角矩陣。

性方程和求逆

求解線性方程組是矩陣乘法的逆運算。當下面的命令運行後,

b <- A %*% xn

如果僅僅給出A 和b,那麼x 就是該線性方程組的根。在R 裡面,用命令

solve(A,b)n

矩陣的逆可以用下面的命令計算,

solve(A)n

特徵值和特徵向量

ev<-eigen(Sm):用來計算矩陣Sm 的特徵值和特徵向量。這個函數的返回值是一個 含有values 和vectors 兩個分量的列表。

ev <- eigen(Sm)n

ev$values表示Sm 的特徵值向量,ev$vec 則是相應特徵向量構成的一個矩陣。

奇異值分解和行列式

svd(M): 可以把任意一個矩陣M作為一個參數, 且對M 進行奇異值分解。這包括一個和M 列空間一致的正交列U 的矩陣,一個和M 行空間一致的正交列V 的矩陣,以及一個正元素D 的對角矩陣,如M = U %*% D %*% t(V)。D 實際上以對角元素向量的形式返回。svd(M) 的結果是由d, u 和v構成的一個列表。

如果M 是一個方陣,就不難看出

absdetM <- prod(svd(M)$d)n

計算M 行列式的絕對值。如果在各種矩陣中都需要這種運算,我們可以把它定義為一個R 函數

absdet <- function(M) prod(svd(M)$d)n

此後, 我們可以把absdet() 當一個R 函數使用了。R有一個計算行列式的內置函數det和另外一個給出符號和模的函數。

evals <- eigen(Sm, only.values = TRUE)$valuesn

cbind()和rbind()構建分塊矩陣

函數cbind() 和rbind():把向量和矩陣拼成一個新的矩陣。cbind() 把矩陣橫向合併成一個大矩陣(列方式),而rbind()是縱向合併(行方式)。

對數組實現連接操作的函數c()

將一個數組強制轉換成簡單向量的標準方法是用函數as.vector()。

vec <- as.vector(X)n#等價操作nvec <- c(X)n

因子的頻率表

單個因子會把各部分數據分成不同的組。類似的是,一對因子可以實現交叉分組等。函數table() 可以從等長的不同因子中計算出頻率表。如果有k 個因子參數,那麼結果將是一個k-維的頻率分布數組。

statefr <- table(statef) nstatefr <- tapply(statef, statef, length)n

13). 列表(list)

R的列表是一個以對象的有序集合構成的對象。列表中包含的對象又稱為它的分量(components)。分量可以是不同的模式或類型,如一個列表可以同時包括數值向量,邏輯向量,矩陣,復向量,字元數組,函數等等。

Lst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))n

分量常常會被編號,並且可以利用這種編號來訪問分量。如果列表Lst 有四個分量,這些分量則可以用Lst[[1]], Lst[[2]], Lst[[3]] 和Lst[[4]] 獨立訪問。因為Lst 是一個列表,所以函數length(Lst) 給出的僅僅是分量的數目. 列表的分量可以被命名,這種情況下可以通過名字訪問。

構建和修改列表

list():將已有的對象構建成列表。

Lst[5] <- list(matrix=Mat) 列表連接

當連接函數c() 的參數中有列表對象時,結果就是一個列表模式的對象。它的分量是那些當作參數的列表。

list.ABC <- c(list.A, list.B, list.C)n

14). 數據框

數據框是一個屬於data.frame類的列表。

對於可能屬於數據框的列表對象有下面一些限制條件,

  • 分量必須是向量(數值, 字元, 邏輯),因子,數值矩陣,列表或者其他數據框;
  • 矩陣,列表和數據框為新的數據框提供了儘可能多的變數,因為它們各自擁有列,元素或者變數;
  • 數值向量,邏輯值,因子保持原有格式,而字元向量會被強制轉換成因子並且它的水平就是向量中出現的獨立值;
  • 在數據框中以變數形式出現的向量結構必須長度一致,矩陣結構必須有一樣的行數.
  • 數據框常常會被看作是一個由不同模式和屬性的列構成的矩陣。

創建數據框

可以通過函數data.frame 創建符合上面對列(分量)限制的數據框對象:

accountants <- data.frame(home=statef, loot=incomes)n

符合數據框限制的列表可被函數as.data.frame() 強制轉換成數據框。

綁定任意的列表

attach() 是一個泛型函數。它不僅允許搜索路徑綁定目錄和數據框,而且還可以綁定其他對象。所以任何其他"list" 模式的對象都可以這樣綁定:

attach(any.old.list)n

任何被綁定的東西都可利用detach 通過位置編號或者名字(最好採用名字)去 除綁定。

管理搜索路徑

search(): 顯示當前的搜索路徑。它可以用來跟蹤已被綁定或者綁定去除的列表和數據框(以及包)。

search() n[1] 「.GlobalEnv」 「Autoloads」 「package:base」 n

其中.GlobalEnv 是工作空間

lentils 被綁定後,我們可以看到

search() n[1] ".GlobalEnv" "lentils" "Autoloads" "package:base"nls(2) n[1] "u" "v" "w"n

ls (或者objects) 可以用來查看搜索路徑中任何位置的內容。

15). 讀數據

大的數據對象常常是從外部文件中讀入,而不是在R 對話時用鍵盤輸入的。

read.table()函數

為了可以直接讀取整個數據框,外部文件常常要求有特定的格式。 第一行可以有該數據框各個變數的名字。 隨後的行中第一個條目是行標籤,其他條目是各個變數的值。

scan() 函數

假定有三個數據向量,長度一致並且要求並行讀入。其中,第一個向量是字元模式,另外兩個是數值模式,文件是input.dat。第一步是用scan() 以列表的形式讀入這三個向量,

訪問內置數據

R 提供了大約100個內置的數據集(在包datasets 中),其他的包(包括和R捆綁發布的推薦包) 也提供了一些作為例子的數據集。可以用下面的命令查看當前能訪問的數據集列表

data()n

從其他R 包裡面導入數據

為了訪問某個特定包的數據,可以使用參數package,例如

data(package=「rpart」) ndata(Puromycin, package=「datasets」)n

如果一個包已經被library 綁定,那麼它的數據集會被自動地加入到R 的搜索路徑中去。

編輯數據

edit(x):調用數據框和矩陣時,R 會產生一個電子錶形式的編輯環境。

xnew <- edit(xold)n

16) 編寫函數

R語言允許用戶創建自己的函數(function)對象,如mean(), var(),postscript() 等等,這些函數都是用R 寫的,因此在本質上和用戶寫的沒有差別。

一個函數是通過下面的語句形式定義的,

name <- function(args, ...) {}n

其中expression 是一個R 表達式(常常是一個成組表達式),它利用參數argi 計算最終 的結果。該表達式的值就是函數的返回值。 可以在任何地方以name(expr1 , expr2 , …) 的形式調用函數。

函數定義如下:

twosam <- function(y1, y2) {n n1 <- length(y1); n2 <- length(y2)n yb1 <- mean(y1); yb2 <- mean(y2)n s1 <- var(y1); s2 <- var(y2)n s <- ((n1-1)*s1 + (n2-1)*s2)/(n1+n2-2)n tst <- (yb1 - yb2)/sqrt(s*(1/n1 + 1/n2))n tstn}na<-1:3;b<-5:7ntwosam(a,b)n

參數命名和默認值

和產生正則序列一樣,如果被調用函數的參數以"name=object"方式給出,它們可以用任何順序設置。但是,參數賦值序列可能以未命名的,位置特異性的方式給出,同時也有可能在這些位置特異性的參數後加上命名參數賦值。 因此,如果有下面方式定義的函數fun1

fun1 <- function(data, data.frame, graph, limit) {}n

… 參數

一個函數的參數設置可以傳遞給另外一個函數。這個可以通過給函數增加一個額外的參數來實現。

舉例如plot

plotnfunction (x, y, ...)n

在函數中賦值

注意任何在函數內部的普通賦值都是局部的暫時的,當退出函數時都會丟失。因此函數中的賦值語句X <- qr(X) 不會影響調用該函數的程序賦值情況。 「強賦值"操作符 <<- :如果想在一個函數裡面全局賦值或者永久賦值

fscope<-function(){n a<-1n b<<-2n c=3n}n

作用域

函數內部的變數可以分為三類:形式參數(formal parameters),局部變數(local variables),自由變數(free variables)。

  • 形式參數是出現在函數的參數列表中的變數。它們的值由實際的函數參數綁定形式參數的過程決定的。
  • 局部變數由函數內部表達式的值決定的。既不是形式參數又不是局部變數的變數是自由變數。
  • 自由變數如果被賦值將會變成局部變數

z<-45nf <- function(x) {n y <- 2*xnprint(x)nprint(y)nprint(z)n}n

x 是形式參數,y 是局部變數,z 是自由變數。

定製環境

可以修改位置初始化文件,並且每個目錄都可以有它特有的一個初始化文件。利用函數.First 和.Last。位置初始化文件的路徑可以通過環境變數R PROFILE 設置。這個文件包括你每次執行R時一些自動運行的命令。

類,泛型函數和面向對象

一個對象的類決定了它會如何被一個泛型函數處理。相反,一個泛型函數由參數自身類的種類來決定完成特定工作或者事務的。如果參數缺乏任何類屬性,或者在該問題中有一個不能被任何泛型函數處理的類,泛型函數會有一種默認的處理方式。

下面的一個例子使這個問題變得清晰。類機製為用戶提供了為特定問題設計和編寫泛型函數的便利。在眾多泛型函數中,plot() 用於圖形化顯示對象,summary()用於各種類型的概述分析,以及anova() 用於比較統計模型。 能以特定方式處理類的泛型函數的數目非常龐大。

methods() 得到當前對某個類對象可用的泛型函數列表:

methods(class="data.frame")n

相反,一個泛型函數可以處理的類同樣很多。例如,plot() 有默認的方法和變 量處理對象類"data.frame","density","factor",等等。

一個完整的列表同樣可以通過函數methods():

methods(plot)n

17) R中的統計模型

線性模型,對於常規的多重模型擬合,最基本的函數是lm()。

fm2 <- lm(y ~ x1 + x2, data = production)n

將會擬合y 對x1 和x2 的多重回歸模型和一個隱式的截距項

提取模型信息的泛型函數

lm() 的返回值是一個模型擬合結果對象;技術上就是屬於類"lm」 的一個結果列表。關於擬合模型的信息可以用適合對象類"lm" 的泛型函數顯示,提取,圖示等等。

add1 coef effects kappa predict residuals alias ndeviance family labels print step anova drop1 nformula plot proj summaryn

  • anova(object1 , object2) 比較一個子模型和外部模型,並且產生方差分析表。
  • coef(object) 提取回歸係數(矩陣)。全稱:coefficients(object).
  • deviance(object) 殘差平方和,若有權重可加權。
  • formula(object) 提取模型公式信息。
  • plot(object) 產生四個圖,顯式殘差,擬合值和一些診斷圖。
  • predict(object, newdata=data:frame) 提供的數據框必須有同原始變數一樣標籤的變數。結果是對應於data:frame中決定變數預測值的向量或矩陣。
  • predict.gam(object,newdata=data:frame) predict.gam() 是安全模式的predict()。它可以用於lm, glm和gam 擬合對象。在正交多項式作為原始的基本函數並且增加新數據意味著必須使用不同的原始基本函數。
  • print(object) 簡要列印一個對象的內容
  • residuals(object) 提取殘差(矩陣),有權重時可加權,省略方式:resid(object)。
  • step(object) 通過增加或者減少模型中的項並且保留層次來選擇合適的模型。在逐步搜索過程中,AIC (Akaike信息規範)值最大的模型將會被返回。
  • summary(object) 顯示較詳細的模型擬合結果

18). 圖形工具

圖形工具是R 環境裡面一個非常重要和多用途的組成部分。我們可以用這些圖形工具顯示各種各樣的統計圖並且創建一些全新的圖。

圖形工具既可互動式使用,也可以批處理使用。在許多情況下,互動式使用是最有效的。打開R 時,它會啟動一個圖形設備驅動(device driver)。該驅動會打開特定的圖形窗口(graphics window)以顯示互動式的圖片。儘管這些都是自動實現的,了解用於UNIX 系統的X11() 命令和Windows 系統的windows() 命令是非常有用的。一旦設備驅動啟動,R 繪圖命令可以用來產生統計圖或者設計全新的圖形顯示。

繪圖命令可以分成了三個基本的類:

  • 高級繪圖命令: 在圖形設備上產生一個新的圖區,它可能包括坐標軸,標籤,標題等等。
  • 低級畫圖命令: 會在一個已經存在的圖上加上更多的圖形元素,如額外的點,線和標籤。
  • 互動式圖形命令: 允許你互動式地用定點設備(如滑鼠)在一個已經存在的圖上添加圖形信息或者提取圖形信息。

高級繪圖命令

plot(),這是一個泛型函數:產生的圖形依賴於第一個參數的類型或者類。 pairs(X),描繪多元數據提供了兩個非常有用的函數

低級圖形函數

高級圖形函數不能準確產生你想要的圖。低級圖形命令可以在當前圖上精確增加一些額外信息(如點,線或者文字)。 points(x, y) lines(x, y)

數學標註

在某些情況下,在一個圖上加上數學符號和公式是非常有用的。在R 裡面,這可以通過函數expression 實現,

text(x, y, expression(paste(bgroup("(", atop(n, x), ")"), p^x, q^{n-x})))n

圖像設備輸出

  • X11() 用UNIX 類型的系統的X11 桌面系統
  • windows() 用於Windows 系統
  • quartz() 用於MacOS X 系統
  • postscript() 用於PostScript 印表機,或者創建PostScript 文件。
  • pdf() 創建可以插入PDF 文件中PDF 文件
  • png() 創建PNG 點陣圖文件。(不總是有效的:參考它的幫助文件)
  • jpeg() 創建JPEG 點陣圖文件,非常適用於影
    • 19). 包(packages)

      所有的R 函數和數據集是保存在包裡面的。只有當一個包被載入時,它的內容才可以被訪問。這樣做一是為了高效,二是為了幫助包的開發者防止命名和其他代碼中的名字衝突。

      library():查看系統中安裝的包 library(plyr):載入plyr包 CRAN.packages() 連接網際網路,並且允許自動更新和安裝包。 search()為了查看當前有那些包載入了

      標準包

      標準包構成R 原代碼的一個重要部分。它們包括允許R 工作的的基本函數,和本文檔中描述的數據集,標準統計和圖形工具。在任何R 的安裝版本中,它們都會被自動獲得。

      捐獻包和CRAN

      世界各地的作者為R 捐獻了好幾百個包。其中一些包實現了特定的統計方法,另外一些給予數據和硬體的訪問介面,其他則作為教科書的補充材料。 可以從CRAN (http://CRAN.R-project.org/ 和它的鏡像)和其他一些資源,如Bioconductor (Bioconductor - Home) 下載得到

      命名空間

      包有命名空間(namespaces),並且現在所有基本的和推薦的的包都依賴於包datasets。

      它們允許包的作者隱藏函數和數據,即只允許內部用戶使用,它們防止函數在一個用戶使用相同名字時被破壞,它們提供了一種訪問特定包的某個對象的方法。

      有兩個操作符和命名空間相關。 雙冒號操作符:: 選擇一個特定命名空間得到的函數定義。可以通過base::t 使用,因為它是在包base 中定義的。 三冒號操作符::: 可能會出現在一些R 代碼中:它有點像雙冒號操作符,但可以訪問隱藏對象。

      包常常是包之間依賴的(inter-dependent),載入其中一個可能會引起其他包的自動載入。

      4. R基本函數

      請查看:R參考卡片,點擊下載

      5. R的擴展包

      1). plyr (數據處理)

      plyr是一個數據處理的包,可以把大的數據集通過一些條件拆分成小的數據集的功能包。

      數據集baseball(baseball-databank.org/)

      21,699 records covering 1,288 players, spanning 1871 to 2007

      舉例:擊球得分:RBI(Run batted in)

install.packages("plyr")nlibrary(plyr)n?baseballnddply(baseball, .(lg), c("nrow", "ncol"))nrbi <- ddply(baseball, .(year), summarise, mean_rbi = mean(rbi, na.rm = TRUE))nplot(mean_rbi ~ year, type = "l", data = rbi)n

    2). stringr (字元串處理)

    stringr是一個字元串處理的包,可以方便地進行各種字元串的操作。

install.packages("stringr")nlibrary(stringr)nnfruits <- c("one apple", "two pears", "three bananas")nstr_replace(fruits, "[aeiou]", "-")nstr_replace_all(fruits, "[aeiou]", "-")nnstr_replace_all(fruits, "([aeiou])", "")nstr_replace_all(fruits, "([aeiou])", "11")nstr_replace_all(fruits, "[aeiou]", c("1", "2", "3"))nstr_replace_all(fruits, c("a", "e", "i"), "-")n

3). ggplot2 (可視化)

ggplot2專業級的可視化繪圖包

install.packages("ggplot2")nlibrary(ggplot2)ng<-ggplot(mtcars, aes(x=factor(cyl), fill=factor(vs)))ng+geom_bar(position="dodge")n

作者介紹:

民生銀行大數據中心數據分析師,前況客創始人兼CTO,10 年IT編程背景,獲得多項SUN及IBM技術認證。豐富的互聯網應用開發架構經驗,精通R ,Java, Nodejs 多種編程語言,掌握大數據處理,數據挖掘等核心技術,有統計和金融的知識積累。熟悉金融二級市場、交易規則和投研體系。多次在互聯網及數據分析大會中擔任演講嘉賓。著有《R的極客理想-工具篇》、《R的極客理想-高級開發篇》圖書,新書《R的極客理想-量化投資篇》(即將出版),博客 粉絲日誌, Alexa全球排名70k。

博客專欄:張丹的博客專欄

大家也可以加小編微信:tswenqu(備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流


推薦閱讀:

如何成為數據驅動型公司
打造個人新維度 迎接未來新挑戰
從一個小問題洞察掙錢秘籍,卻被90%的數據分析師忽略
如何用數據驅動產品和運營(上)

TAG:R编程语言 | Hadoop | 大数据分析 |