【前言】
本文翻译自Paul Torfs & Claudia Brauer的文章A (very) short introduction to R。其中比较简单的地方没有翻译,不好用中文描述的地方也没有翻译。
1. 简介和安装
R语言是一种用于数据计算和图标制作的强大的语言。建议初学者使用集成开发环境RStudio。安装R和RStudio的部分就不写了,网上搜一下就可以了。
2. RStudio界面
左下方是控制台窗口,也叫命令行窗口,可以在>后输入简单的命令,R就会执行你的命令。这个窗口非常重要,因为这是R具体执行的地方。
左上方是编辑窗口,也叫脚本窗口。这个部分就是用来编程的,可以写入连续的指令。如果这个窗口没有打开,可以点击File->New->R script打开。如果想运行编辑窗口指令,点击Run,或按下CTRL+ENTER。
右上方是工作空间/历史窗口。在工作空间窗口,你可以看到R中存有的各种数据和值,点击就可以查看和更改这些值。历史窗口记录了你之前输入过的指令。
右下方是文件/图标/包/帮助窗口。这里可以打开文件,查看图表(包括以前的)、安装和加载包,以及使用帮助功能。
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
变量为控制