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

        变量为控制

  • 相关阅读:
    你所不知道的React Hooks
    DataRow的RowState属性变化
    gRPC详解
    Protobuf简明教程
    docker容器内没有权限
    Locust高并发情况下的性能优化与分布式场景的应用
    Docker容器日志打满机器的解决方式
    Django单测详解
    使用Flask+uwsgi+Nginx部署Flask正式环境
    Locust-分布式执行
  • 原文地址:https://www.cnblogs.com/r1ce/p/5249860.html
Copyright © 2011-2022 走看看