【前言】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
變量爲控制