【翻譯】A (very) short introduction to R R的簡短介紹

【前言】html

  本文翻譯自Paul Torfs & Claudia Brauer的文章A (very) short introduction to R。其中比較簡單的地方沒有翻譯,很差用中文描述的地方也沒有翻譯。express

1. 簡介和安裝編程

  R語言是一種用於數據計算和圖標製做的強大的語言。建議初學者使用集成開發環境RStudio。安裝R和RStudio的部分就不寫了,網上搜一下就能夠了。windows

2. RStudio界面數組

       

  左下方是控制檯窗口,也叫命令行窗口,能夠在>後輸入簡單的命令,R就會執行你的命令。這個窗口很是重要,由於這是R具體執行的地方。數據結構

  左上方是編輯窗口,也叫腳本窗口。這個部分就是用來編程的,能夠寫入連續的指令。若是這個窗口沒有打開,能夠點擊File->New->R script打開。若是想運行編輯窗口指令,點擊Run,或按下CTRL+ENTER。app

  右上方是工做空間/歷史窗口。在工做空間窗口,你能夠看到R中存有的各類數據和值,點擊就能夠查看和更改這些值。歷史窗口記錄了你以前輸入過的指令。編程語言

  右下方是文件/圖標/包/幫助窗口。這裏能夠打開文件,查看圖表(包括之前的)、安裝和加載包,以及使用幫助功能。ide

3. 工做目錄函數

  先設定本身的工做目錄,也就是生成文件保存的地方。

  在命令行中創建工做目錄的方法:

  >setwd("M:/Hydrology/R/")

  在RStudio裏也可經過Tools->Set working directory來設定。

4. 庫

  利用packages或libraries能夠進行不少數據統計分析。

  安裝package:(以geometry爲例)點擊install packages,輸入geometry,或者在命令窗口輸入install.packages(「geometry」)。

  加載package:在命令窗口中輸入library(「geometry」)。

5. R命令示例

(1)計算

  輸入:

  >10^2 + 36

  獲得答案:

  [1] 136

  練習:用2016減去你在這所學校開始學習的那一年,再除以2016減去你出生那年的差,再乘以100,能夠獲得你已經在這所學校度過了生命的百分之幾。在須要的時候使用括號。

若是你加了左括號,忘了加右括號,那麼>會變成+,若是想要退出運算狀態,按Esc。

(2)工做空間

  能夠給數字一個命名,它就成爲了變量,能夠過一會再次使用。例如:

  > a = 4

  R會記住a的值。你能夠詢問R,a的值是多少。

  > a

  [1] 4

  或者用a進行運算:

  > a * 5

  [1] 20

  若是從新定義a,R就會忘記原來的值,而是記住新的值。

  > a = a + 10

  > a

  [1] 14

  若是要把因此變量從R的存儲中移除:

  >rm(list=ls())

  或者點擊工做空間窗口的clear all。若是隻想移除變量啊,輸入rm(a)。

  注意命名必須以字母開頭。

(3)標量、向量和矩陣

  標量是一個數,0維;向量是一個一維數組;矩陣是一個二維數組。

  定義一個向量,使用函數c,是concatenate的簡寫:

  >b = c(3,4,5)

(4)函數

  若是你想算向量b中全部數的平均值,你能夠這麼寫:

  > (3+4+5)/3

  但若是向量特別長的話這麼寫就太繁瑣了,因此可使用函數。你可使用R裏有的函數,也能夠用你本身寫的函數。

  > mean(x=b)

  括號裏是參數,給函數提供額外信息。x表示平均函數須要操做的向量是b。也能夠省略x,寫成mean(b)。

  練習:先將4,5,8,11編到一個向量中,而後用sum函數計算其和。

  再舉一個例子:rnorm函數,可以從一個普通的分佈生成隨機的樣本。輸入下列代碼,而後按ENTER,你就能獲得10個隨機數。

  >rnorm(10)

  [1] -0.949 1.342 -0.474 0.403

  [5] -0.091 -0.379 1.015 0.740

  [9] -0.639 0.950

  第一行的rnorm是函數,10是參數,決定了產生多少個隨機數。下面三行是結果,產生了10個隨機數,生成一個10長度的向量。

  再從新輸入一次就會產生新的10個隨機數。可使用上箭頭來恢復前一個指令。若是你想經過一個平均值爲1.2標準差爲3.4的普通分佈獲得10個隨機數,能夠輸入:

  >rnorm(10, mean=1.2, sd=3.4)

  能夠看出rnorm有三個參數,能夠只給出第一個參數,後兩個參數會用默認值代替。RStudio在你輸入rnorm的時候會自動顯示參數信息。

5. 圖表

  R能夠生成圖表。簡單的例子:

  > x = rnorm(100)

  > plot(x)

  結果會生成這個圖:

 

  練習:生成100個隨機數的圖表。

6. 幫助和文檔

  輸入:

  >help(rnorm)

  可以獲得rnorm這個函數的描述,包括參數以及默認值等等。輸入:

  > example(rnorm)

  可以獲得rnorm的一些使用例子。輸入:

  >help.start()

  能夠獲得一個基於HTML編寫的幫助總覽。

  當輸入函數名稱以及一個左括號後,按TAB鍵能夠獲得函數的參數信息,見下圖。

   

  其餘有用的連接:

  http://cran.r-project.org/doc/manuals/ R-intro.pdf一個完整的手冊

  http://cran.r-project.org/doc/contrib/ Short-refcard.pdf一個簡短的參考文檔

  http://zoonek2.free.fr/UNIX/48_R/all. html包含了豐富的例子

  http://www.statmethods.net/也叫Quick-R,提供了高效率的幫助。

  http://mathesaurus.sourceforge.net/編程語言的詞典。

  使用谷歌搜索也至關高效。

  練習:查看sqrt函數的幫助。

7. 腳本

  R是一種相似於Python的解釋型語言。你能夠直接在控制檯裏打出命令。你也能夠把命令存儲在文件裏,這就叫作腳本,這些文件的拓展名通常是.R,好比foo.R。你能夠經過點擊File->New->Open file打開編輯窗口來編輯文件。

  先選擇要執行的部分,而後按CTRL+ENTER或者點擊Run來部分執行代碼。若是不選擇,那麼程序會從光標停留的行開始執行。執行所有代碼的命令是:

  > source(「foo.R」)

  也能夠點擊Run all,或者按CTRL+SHIFT+S來執行所有的代碼。

  練習:創建一個名爲firstscript.R的文件,指令爲產生100個隨機數,並用圖表展現。屢次執行這個腳本。

8. 數據結構

(1)向量

  使用函數c()來構造向量:

  > vec1 = c(1,4,6,8,10)

  > vec1

  [1] 1 4 6 8 10

  可用[i]來指定向量中的值:

  > vec1[5]

  [1] 10

  能夠替換指定位置的值:

  > vec1[3] = 12

  > vec1

  [1] 1 4 12 8 10

  另外一種構造向量的方式,使用seq()函數:

  > vec2 = seq(from=0, to=1, by=0.25)

  > vec2

  [1] 0.00 0.25 0.50 0.75 1.00

  R中有不少基於向量的計算函數。若是將兩個長度相同的向量相加,其中的元素會對應相加:

  > vec1 + vec2

  [1] 1.00 4.25 12.50 8.75 11.00

(2)矩陣

  用函數matrix定義矩陣。

  > mat=matrix(data=c(9,2,3,4,5,6), ncol=3)

  > mat

          [,1] [,2] [,3]

  [1,]9  3  5

  [2,]2  4  6

  參數data表示在矩陣中出現的數字。ncol定義了列數,也可使用nrow來定義行數。

  練習:把31-60這幾個數放在名爲P的向量中,而後放到一個6行5列的矩陣Q中。提示:使用seq函數。

  矩陣的操做與向量相似,指定[row, column]可表示矩陣中元素。

  >mat[1,2]

  [1] 3

  指定整個行:

  >mat[2,]

  [1] 2 4 6

  以矩陣爲參數的函數。

  > mean(mat)

  [1] 4.8333

(3)數據幀

  數據幀就是一個矩陣,但與矩陣不一樣的是,它的每一列都是有命名的,因此有的時候你可使用其中一個數值而無需知道它的準確位置:

  > t = data.frame(x = c(11,12,14), y = c(19,20,21), z = c(10,9,7))

  > t

    x  y  z

  1  11  20 10

  2  12  20  9

  3  14  21  7

  兩種經過使用z列進行平均值運算的方法:

  > mean(t$z)

  [1] 8.666667

  > mean(t[[「z」]])

  [1] 8.666667

  練習:編寫一個腳本文件,創建3個隨機數向量,每一個向量長度爲100,將其命名爲x1,x2和x3。創建1個數據幀,名爲t,其中的向量爲a,b,c,其中a=x1,b=x1+x2,c=x1+x2+x3。調用下列函數:plot(t)和sd(t)。你能理解結果嗎?

(4)列表

  列表與矩陣和數據幀不一樣的是,它的列長度能夠不相同。

  > L = list(one=1, two=c(1,2), five=seq(0,1,length=5))

  > L

  $one

  [1] 1

  $two

  [1] 1 2

  $five

  [1] 0.00 0.25 0.50 0.75 1.00

  能夠顯示出L中有哪些列:

  > names(L)

  [1] 「one」「two」「five」

  也可使用裏面的數:

  >L$five + 10

  [1] 10.00 10.25 10.50 10.75 11.00

9. 圖表

  簡單的圖生成:

  > plot(rnorm(100), type=「1」, col=「gold」)

  這個命令生成100個隨機數,在圖上表示,並鏈接每個點。type=l就是表示將點用直線鏈接。col表示線的顏色是金色。

  再來一個直方圖的例子:

  >hist(rnorm(100))

  練習:使用下面的命令,用在前一個練習生成的結構中,本身經過實驗搞清楚rgb是什麼意思,rgb的參數是什麼意思;lwd,pch,cex分別是什麼意思。

  >plot(t$a, type=「l」, ylim=range(t), lwd=3, col=rgb(1,0,0,0.3))

  >lines(t$b, type=「s」, lwd=2, col=rgb(0.3, 0.4, 0.3, 0.9))

  >points(t$c, pch=20, cex=4, col=rgb(0,0,1,0.3))

  想要知道更多關於圖表的信息,輸入help(par)。谷歌「R color chart」,能夠獲得一個關於顏色選擇的pdf文件。點擊圖表窗口的Export,能夠選擇最佳高度和寬度,而後點擊Copy或者Save。

10. 讀寫文件

  有不少種讀寫文件的方式,這裏只介紹一種。先創建一個數據幀d:

  > d = data.frame(a = c(3,4,5), b = c(12,43,54))

  > d

    a  b

  1  3  12

  2  4  43

  3  5  54

  >write.table(d, file=」tst0.txt」, row.names=FALSE)

  將數據幀d寫入文件tst0.txt,參數row.names=FALSE表示不把行名寫入文件,由於行名並不重要,只是一些數字而已。

  > d2 = read.table(file=」tst0.txt」, header=TRUE)

  > d2

    a  b

  1  3  12

  2  4  43

  3  5  54

  使用read.table函數將文件中的數據寫到d2中。

  練習:用下圖數據創建文件tst1.txt。讀取並將名爲g的列中值乘以5,存入文件tst2.txt。

11. 沒法獲取的數據

  練習:計算一個有100個隨機數的向量的平方根的平均數。會發生什麼?

  當某個數據沒法獲取時,用NA表示:

  > j = c(1,2,NA)

  對於j就不能進行常規的計算了。好比:

  > max(j)

  [1] NA

  計算不出最大值。

  若是必定要計算的話,使用參數na.rm=TRUE,意思大概就是忽略NA的值:

  >max(j, na.rm=TRUE)

  [1] 2

12. 類

  以前接觸的都是數,有的時候你可能想處理一些不僅是數的數據,好比一個名稱或者一個數據文件。R中有三種類:numeric,character和POSIX。

(1)characters字符

  定義一個字符串,須要加上雙引號。

  > m = 「apples」

  >m

  [1] 「apples」

  > n = pears

  ERROR: object ‘pears’ not found

  也不能用字符串進行數學運算。

  > m+2

  Error in m + 2 : non-numeric argument to binary operator

(2)日期

  日期和時間比較複雜。使用strptime函數是最簡單的告訴R語言時間的方法:

  > data1=strptime(c(「20100225230000」, 「20100226000000」, 「20100226010000」), format=」%Y%m%d%H%M%S」)

  > date1

  [1] "2010-02-25 23:00:00"

  [2] "2010-02-26 00:00:00"

  [3] "2010-02-26 01:00:00"

  先用c()函數創建一個向量,記住用雙引號,由於strptime須要字符串做爲輸入。format參數決定了讀入時間的格式。依次是年、月、日、時、分、秒。

  練習:生成一張圖,x軸表示今天、2014年的聖尼古拉斯日、你的生日。y軸表示你想在這些日子獲得禮物的數目。

13. 編程工具

  若是須要編大程序,可能會用到一些編程語句:

(1)if語句

  > w = 3

  >if(w< 5)

    {

     d=2

  }else{

    d=10

    }

  > d

  2

  學過編程的都明白就不詳細說了。

  也能夠用於界定特殊的條件:

  > a = c(1,2,3,4)

  > b = c(5,6,7,8)

  > f = a[b==5 | b==8]

  >f

  [1] 1 4

  注意雙等於的符號。還有一些其餘的符號,好比<、>、!=、<=、>=。若是要驗證多於一個條件,使用&表示且,使用|表示或。

(2)for循環

    要定義次數和每次作的動做。

    > h = seq(from=1, to=8)

    > s = c()

    > for(i in 2:10)

      {

      s[i] = h[i] * 10

      }

    > s

    [1] NA 20 30 40 50 60 70 80 NA NA

    首先定義一個向量h。而後創建一個空向量s。for循環的目的是將2到10個元素乘以10,而後放到s中。

    練習:創建一個從1到100的向量,用for循環遍歷整個向量,將比5小的值和比90大的值乘以10。其餘的值乘以0.1。

(3)編寫本身的函數

    > func1 = function(arg1, arg2)

      {

      w = arg1^2

      return(arg2+w)

      }

    > func1(arg1 = 3, arg2 = 5)

    [1] 14

    練習:把上一個練習寫成函數,在函數中使用for循環。能夠用length函數來定義循環的範圍。

14. 一些有用的參考

(1)函數

  R reference card中提到的一些函數:

a) data creation

    • read.table: 從文件中讀取一個文件。 參數: header=TRUE: 將第一行讀做列名; sep=",": 數據由逗號隔開; skip=n: 不讀取前n行。

    • write.table: 將一個表寫入文件。

    • c: 將數字集合起來生成一個向量。

    • array: 創建一個向量, 參數: dim: length

    • matrix:創建一個矩陣, 參數: ncol and/or nrow: number of rows/columns

    • data.frame: 創建一個數據幀

    • list: 創建一個列表

    • rbind and cbind: 將兩個向量按行或按列組合成一個矩陣

b) extracting data

    • x[n]: 向量中的第n個元素

    • x[m:n]: 第m個到第n個元素

    • x[c(k,m,n)]: 特定位置的元素

    • x[x>m & x<n]: m和n之間的元素

    • x$n: 列表或數據幀中名爲n的元素

    • x[["n"]]: 同上

    • [i,j]: 第i行第j列的元素

    • [i,]: 矩陣中的第i行

c) Information on variables

    • length: 矩陣的長度

    • ncol or nrow: 矩陣中的列或行號

    • class: 變量的類

    • names: 列表中一個對象的名字

    • print: 在屏幕上顯示變量或字符串

    • return: 在函數中用於返回變量

    • is.na: 判斷變量是否爲NA

    • as.numeric or as.character: 將類變爲數字或字符串

    • strptime: 將字符串的類轉換爲時間(POSIX)

d) Statistics

    • sum: 向量或矩陣元素的和

    • mean: 向量的平均值

    • sd: 向量的標準差

    • max or min: 最大或最小元素

    • rowSums (or rowMeans, colSums and colMeans): 矩陣中每行/列的和/平均值。結果是一個向量。

    • quantile(x,c(0.1,0.5)): sample the 0.1 and 0.5th quantiles of vector x

e) Data processing

    • seq: 均勻地創建向量(好比from1to100)

    • rnorm: 創建一個基於日常分佈的隨機數向量

    • sort: 將元素升序排列

    • t: 轉置一個矩陣

    • aggregate(x,by=ls(y),FUN="mean"): 將x按照y分爲子集,計算子集的平均值,生成一個新的列表。

    • na.approx: interpolate (in zoo package). Argument: vector with NAs. Result: vector without

NAs.

    • cumsum: 累積和,結果是一個向量。

    • rollmean: moving average (in the zoo package)

    • paste: 將字符串黏合在一塊兒

    • substr: 將一個字符串分紅幾個部分

f) Fitting

    • lm(v1sv2): linear fit (regression line) between vector v1 on the y-axis and v2 on the x-axis

    • nls(v1sa+b*v2, start=ls(a=1,b=0)): nonlinear fit. Should contain equation with variables (here v1 and v2 and parameters (here a and b) with starting values

    • coef: returns coe"cients from a fit

    • summary: returns all results from a fit

g) Plotting

    • plot(x): plot x (y-axis) versus index number (x-axis) in a new window

    • plot(x,y): plot y (y-axis) versus x (x-axis) in a new window

    • image(x,y,z): plot z (color scale) versus x (x-axis) and y (y-axis) in a new window

    • lines or points: add lines or points to a previous plot

    • hist: plot histogram of the numbers in a vector

    • barplot: bar plot of vector or data frame

    • contour(x,y,z): contour plot

    • abline: draw line (segment). Arguments: a,b for intercept a and slope b; or h=y for horizontal line at y; or v=x for vertical line at x.

    • curve: add function to plot. Needs to have an x in the expression. Example: curve(x^2)

    • legend: add legend with given symbols (lty or pch and col) and text (legend) at location

(x="topright")

    • axis: add axis. Arguments: side – 1=bottom, 2=left, 3=top, 4=right

    • mtext: add text on axis. Arguments: text (character string) and side

    • grid: add grid

     • par: plotting parameters to be specified before the plots. Arguments: e.g. mfrow=c(1,3)):

number of figures per page (1 row, 3 columns); new=TRUE: draw plot over previous plot.

h) Plotting parameters

    These can be added as arguments to plot, lines,image, etc. For help see par.

    • type: "l"=lines, "p"=points, etc.

    • col: color – "blue", "red", etc

    • lty: line type – 1=solid, 2=dashed, etc.

    • pch: point type – 1=circle, 2=triangle, etc.

    • main: title - character string

    • xlab and ylab: axis labels – character string

    • xlim and ylim: range of axes – e.g. c(1,10)

    • log: logarithmic axis – "x", "y" or "xy"

i) Programming

    • function(arglist){expr}: function definition: do expr with list of arguments arglist

    • if(cond){expr1}else{expr2}: if-statement: if cond is true, then expr1, else expr2

    • for(var in vec) {expr}: for-loop: the counter var runs through the vector vec and does expr each run

    • while(cond){expr}: while-loop: while cond is true, do expr each run

(2)快捷鍵

    可點擊Help->Keyboard Shortcuts查看。

    • CRL+ENTER: 將腳本窗口的命令發送到命令窗口

    • 向上箭頭or 向下箭頭 in command window: previous or next command

    • CTRL+1, CTRL+2, etc.: change between the windows Not R-specific, but very useful keyboard shortcuts:

    • CTRL+C, CTRL+X and CTRL+V: copy, cut and paste

    • ALT+TAB: change to another program window

    • 向上, 向下, 向左or 向右: move cursor

    • HOME or END: move cursor to begin or end of line

    • Page Up or Page Down: move cursor one page up or down

    • SHIFT+向上/向下/向左/向右/HOME/END/PgUp/PgDn: select

(3)錯誤信息

    • No such file or directory or Cannot change working directory

    確保工做目錄和文件名正確

    • Object ‘x’ not found

    變量x尚未被定義,定義x或者用雙引號表示x是一個字符串。

    • Argument ‘x’ is missing without default

    你沒有定義參數x,若是參數x是強制性定義的。

    • +

    R正在運行中或者你忘了加右括號。等待,或者單擊}、)或單擊ESC。

    • Unexpected ’)’ in ")" or Unexpected ’}’ in "}"

    多打了右邊括號。

    • Unexpected ‘else’ in "else"

    Put the else of an if-statement on the same line as the last bracket of the 「then」-part: }else{.

    • Missing value where TRUE/FALSE needed

    條件部分出現問題,好比(if(x==1)),x是否是NA?

    • The condition has length > 1 and only the first element will be used

    好比(if(x==1))若是x是一個向量就會報錯。試一試x[i]。

    • Non-numeric argument to binary operator

    試圖對非數字進行運算。試一下class()測試一下數據的類,或用as.numeric()轉換爲數字。

    • Argument is of length zero or Replacement is of length zero

    變量爲控制

相關文章
相關標籤/搜索