【翻译】A (very) short introduction to R R的简短介绍

时间:2022-02-08 17:46:36

【前言】

  本文翻译自Paul Torfs & Claudia Brauer的文章A (very) short introduction to R。其中比较简单的地方没有翻译,不好用中文描述的地方也没有翻译。

1. 简介和安装

  R语言是一种用于数据计算和图标制作的强大的语言。建议初学者使用集成开发环境RStudio。安装R和RStudio的部分就不写了,网上搜一下就可以了。

2. RStudio界面

       【翻译】A (very) short introduction to R R的简短介绍

  左下方是控制台窗口,也叫命令行窗口,可以在>后输入简单的命令,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)

  结果会生成这个图:

【翻译】A (very) short introduction to R R的简短介绍 

  练习:生成100个随机数的图表。

6. 帮助和文档

  输入:

  >help(rnorm)

  能够得到rnorm这个函数的描述,包括参数以及默认值等等。输入:

  > example(rnorm)

  能够得到rnorm的一些使用例子。输入:

  >help.start()

  可以得到一个基于HTML编写的帮助总览。

  当输入函数名称以及一个左括号后,按TAB键可以得到函数的参数信息,见下图。

   【翻译】A (very) short introduction to R R的简短介绍

  其他有用的链接:

  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表示线的颜色是金色。

【翻译】A (very) short introduction to R R的简短介绍

  再来一个直方图的例子:

  >hist(rnorm(100))

【翻译】A (very) short introduction to R R的简短介绍

  练习:使用下面的命令,用在前一个练习生成的结构中,自己通过实验搞清楚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。

【翻译】A (very) short introduction to R R的简短介绍

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

    变量为控制