【前言】

  本文翻译自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

变量为控制

【翻译】A (very) short introduction to R R的简短介绍的更多相关文章

  1. 【Moqui业务逻辑翻译系列】--UBPL Introduction同意的商业处理文库介绍

    h1. UBPL Introduction 通用的商业处理文库介绍h4. Why a Universal Business Process Library? 为什么需要通用的商业处理文库? The g ...

  2. RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

    RapeLay(电车之狼R)的结局介绍 (隐藏结局) 必备知识要让MM怀孕非常easy.起初刚进入调教模式后.仅仅要H一次 MM就開始有时期状态. 生理(连上有红晕) ->不详状态(闭目第一次) ...

  3. 把十进制整数转换为r(r=2)进制输出(顺序栈实现)

    上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

  4. (转)\r \r\n \t 的区别

    小风吹雪 \r \r\n \t 的区别 http://www.360doc.com/content/12/0530/15/16538_214756101.shtml \n 软回车:       在Wi ...

  5. python文件操作各种模式和常用方法总结r r+ rb r+b

    1.读,r r+ rb r+b read() 全部读取 read(n) 读取一部分 r模式下:n 个字符. rb模式下:n个 字节. readline() 按行读取. readlines() 返回个列 ...

  6. (二十八)fopen与读写的标识r,r+,rb+,rt+,w+.....

    fopen与读写的标识r,r+,rb+,rt+,w+..... 函数简介 函数功能: 打开一个文件 函数原型:FILE * fopen(const char * path,const char * m ...

  7. python-基础r/R、b、u/U含义

    1.r/R,代表非转义的原始字符串,一般使用在正则表达式和win目录上 2.b“” 代表b后面的内容为bytes类型 3.u/U 表示对字符串进行unicode编码,一般使用在有中午的地方,防止乱码.

  8. Apache log4j 1.2 - Short introduction to log4j

    Apache log4j 1.2 - Short introduction to log4jhttps://logging.apache.org/log4j/1.2/manual.html log4j ...

  9. 文件操作:w,w+,r,r+,a,wb,rb

    1.文件操作是什么? 操作文件: f = open("文件路径",mode="模式",encoding="编码") open() # 调用操 ...

随机推荐

  1. 重新开始学习javase_对象的摧毁

    一.概述(转:@深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版) ) 经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了 ...

  2. (转)C++静态库与动态库

    本文出自 http://www.cnblogs.com/skynet/p/3372855.html 吴秦 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不 ...

  3. adb server is out of date. killing... 解决方案

    忘了原文从哪来的了,过后查到补上链接 今天调试android的时候发现一个诡异的问题 C:\Users\xxxx>adb start-server   adb server is out of ...

  4. JQuery验证input

    jsp中表单如下: <form method="post" action="AddPlayer"> <div class = "on ...

  5. [HttpClient]HttpClient简介

    1. 前言 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java应用程序需要直接通过 HTTP 协议来访问网路资源.虽然在 JDK 的 java net包中已 ...

  6. [jstl] forEach标签使用

     在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JS ...

  7. 【转】关于TP3.2 验证码不显示的问题

    在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){                $verify = new \Think\Veri ...

  8. Nginx源码研究七:nginx的location指令分析

    在nginx的配置文件nginx.conf中,我们在配置server的时候,会配置一下location指令,这个location指令是提供给用户来配置对于符合指令的http请求,采用该指令内部的处理方 ...

  9. laravel框架——上传、下载文件

    文件上传 在config文件夹下新建一个 项目名.php return [ 'title' => 'My Test', 'posts_per_page' => 5, 'uploads' = ...

  10. 转:FIFO的定义与作用

    一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令. 1.什么是FIFO? FIFO是英文Firs ...