zoukankan      html  css  js  c++  java
  • 【翻译】A (very) short introduction to R R的简短介绍

    【前言】

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

        变量为控制

  • 相关阅读:
    ExtJS小技巧
    Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
    NPM 私服
    IDEA 不编译java以外的文件
    SQL 引号中的问号在PrepareStatement 中不被看作是占位符
    Chrome 浏览器自动填表呈现淡黄色解决
    批量删除Maven 仓库未下载成功.lastupdate 的文件
    Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)
    Hibernate 自动更新表出错 建表或添加列,提示标识符无效
    Hibernate 自动更新表出错 More than one table found in namespace
  • 原文地址:https://www.cnblogs.com/r1ce/p/5249860.html
Copyright © 2011-2022 走看看