R基础知识

1.1 初始步骤

  • # 为了直接使用教材《R语言基础入门(第二版)》里面的所有代码
    library("ISwR") 
    
  • plot(rnorm(1000)) (rnorm = random normal) – 抽取1000个服从正态分布的随机数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HF9fqFut-1591862325388)()]

  • rnorm(15)
    [1] -0.24211402  0.08589471
     [3] -0.07917081  0.78363253
     [5] -0.62952288  2.13197662
     [7]  1.16027151 -0.90685741
     [9]  0.58068752  0.06921175
    [11]  0.77682220 -0.00420059
    [13] -2.70962699  1.71607284
    [15] -0.32027957
    

大型计算器

  • 常规运算

  • exp(0)
    [1]1
    

赋值

  • x<-2
    x
    [1]2
    
  • 字符 < 和 - 应该理解为一个符号

  • 箭头指向的是被赋值的变量,它被称为赋值运算

  • 若在 <- 中间加一个空格,他的意思则为一个小于号 和 负号

  • 变量名:它可以由 字母、数字、点号构成,但是不能以数字开头,点好开头的变量名是特殊的,应该尽量避免

  • 有些变量名已经被系统使用,若你重新定义,他们将失去原意

向量运算

  • 结构 c(…) 用来构造向量

  • > height<-c(1.75,1.80,1.65,1.90,1.74,1.91)
    > sum(height)/length(height)
    [1] 1.791667
    > mean(height)
    [1] 1.791667
    

标准过程

  • > weight<-c(60,72,57,90,95,72)
    > height<-c(1.75,1.80,1.65,1.90,1.74,1.91)
    > bmi<-weight/height^2
    > t.test(bmi,mu=22.5)
    
    	One Sample t-test
    
    data:  bmi
    t = 0.34488, df = 5, p-value = 0.7442
    alternative hypothesis: true mean is not equal to 22.5
    95 percent confidence interval:
     18.41734 27.84791
    sample estimates:
    mean of x 
     23.13262 
    

作图

plot(height,weight)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BgPeWJsl-1591862325391)()]

  • 使用 关键字 pch

  • plot(height,weight,pch=2)
    lines(height,22.5*height^2)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNZ4vuVd-1591862325392)()]

1.2 R语言基础

表达式和对象

  • 表达式通常包含变量引用、运算符、函数调用……

函数和参数

  • args(plots.default)
    

向量

  • 数值向量、字符向量、逻辑向量

  • > x<-c(1:10)
    > y<-c("Huey","Dewey","Louie")
    > z<-c(T,T,F,F)
    > x>5
     [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    > y=="Dewey"
    [1] FALSE  TRUE FALSE
    > z
    [1]  TRUE  TRUE FALSE FALSE
    

引用和转义序列

  • > cat(c("Huey","Dewey","Louie"))
    Huey Dewey Louie
    
  • > cat("What is "R"?")
    错误: unexpected symbol in "cat("What is "R"
    > cat("What is \"R\"?\n")
    What is "R"?
    

缺失值

  • R允许向量包含特殊的NA值
  • 这个值在计算中可以被执行
  • 对NA的操作同样也会产生NA值

生成向量的函数

  • c

  • > c(1,2,34,5,5,7,1)
    [1]  1  2 34  5  5  7  1
    > x<-c(12,2,3,4)
    > y<-c(22,3,4,5)
    > c(x,y,90,20,19)
     [1] 12  2  3  4 22  3  4  5 90 20 19
    
    > lis<-c(red="huey",blue="Dewey",green="Louie")
    > lis
        red    blue   green 
     "huey" "Dewey" "Louie" 
    > names(lis)
    [1] "red"   "blue"  "green"
    
  • seq 用来建立数字等差序列

  • > seq(4,10)
    [1]  4  5  6  7  8  9 10
    > seq(4,10,2)
    [1]  4  6  8 10
    > seq(4,10,3)
    [1]  4  7 10
    
  • rep 用来产生重复值

  • > oops<-c(1,2,3)
    > rep(oops,3)
    [1] 1 2 3 1 2 3 1 2 3
    > rep(oops,1:3)
    [1] 1 2 2 3 3 3
    > rep(1:3,c(1:3))
    [1] 1 2 2 3 3 3
    

矩阵和数组

  • 在数学上,矩阵就是一个二维的数组

  • > x<-1:12
    > dim(x)<-c(3,4)
    > 
    > x
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    

矩阵的存储时以列为主的

  • 创建矩阵的一个方便方法时使用 matrix 函数:

  • > matrix(1:12,nrow = 3,byrow = T)
         [,1] [,2] [,3] [,4]
    [1,]    1    2    3    4
    [2,]    5    6    7    8
    [3,]    9   10   11   12
    > matrix(1:12,nrow = 3,byrow = F)
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    > matrix(1:12,ncol = 2,byrow = T)
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    [3,]    5    6
    [4,]    7    8
    [5,]    9   10
    [6,]   11   12
    > matrix(1:12,ncol = 2,byrow = F)
         [,1] [,2]
    [1,]    1    7
    [2,]    2    8
    [3,]    3    9
    [4,]    4   10
    [5,]    5   11
    [6,]    6   12
    
  • 注意:byrow=T 及 按行填充 ( byrow=TRUE)

  • rownames、colnames、转置函数 t

  • > x<-matrix(1:20,nrow = 5)
    > x
         [,1] [,2] [,3] [,4]
    [1,]    1    6   11   16
    [2,]    2    7   12   17
    [3,]    3    8   13   18
    [4,]    4    9   14   19
    [5,]    5   10   15   20
    > rownames(x)
    NULL
    > rownames(x)<-letters[1:5]
    > x
      [,1] [,2] [,3] [,4]
    a    1    6   11   16
    b    2    7   12   17
    c    3    8   13   18
    d    4    9   14   19
    e    5   10   15   20
    > rownames(x)
    [1] "a" "b" "c" "d" "e"
    
  • > t(x)
          a  b  c  d  e
    [1,]  1  2  3  4  5
    [2,]  6  7  8  9 10
    [3,] 11 12 13 14 15
    [4,] 16 17 18 19 20
    
  • cbind、rbind 分别是按行、按列将向量“粘”在一起

  • > cbind(a=1:4,b=5:8,c=9:12)
         a b  c
    [1,] 1 5  9
    [2,] 2 6 10
    [3,] 3 7 11
    [4,] 4 8 12
    > rbind(a=1:3,b=4:6,c=7:10) #我们发现  数字不足时:循环填充
      [,1] [,2] [,3] [,4]
    a    1    2    3    1
    b    4    5    6    4
    c    7    8    9   10
    Warning message:
    In rbind(a = 1:3, b = 4:6, c = 7:10) :
      number of columns of result is not a multiple of vector length (arg 1)
    > rbind(a=1:3,b=4:6,c=7:9)
      [,1] [,2] [,3]
    a    1    2    3
    b    4    5    6
    c    7    8    9
    

因子

  • 类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)

如你所见,变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别 变量。糖尿病类型Diabetes(Type1、Type2)是名义型变量的一例。即使在数据中Type1编码 为1而Type2编码为2,这也并不意味着二者是有序的。有序型变量表示一种顺序关系,而非数量 关系。病情Status(poor, improved, excellent)是顺序型变量的一个上佳示例。我们明白, 病情为poor(较差)病人的状态不如improved(病情好转)的病人,但并不知道相差多少。连续 型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。年龄Age就是一个连续型变 量,它能够表示像14.5或22.8这样的值以及其间的其他任意值。很清楚,15岁的人比14岁的人年 长一岁。

  • 函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1… k ](其中k 是名义 型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上

  • 对于字符型向量,因子的水平默认依字母顺序创建

    > status<-c("Ailing","Improved","Excellent","Ailing")
    > status<-factor(status,ordered = TRUE) #要表示有序型变量,需要为函数factor()指定参数ordered=TRUE
    > status
    [1] Ailing    Improved  Excellent Ailing   
    Levels: Ailing < Excellent < Improved
    > status<-c("Ailing","Improved","Excellent","Z")
    > status<-factor(status,ordered = TRUE)
    > status
    [1] Ailing    Improved  Excellent Z        
    Levels: Ailing < Excellent < Improved < Z
    
  • 按默认的字母顺序排序的因子很少能 够让人满意。 你可以通过指定levels选项来覆盖默认排序。例如:

    > status<-factor(status,ordered = TRUE,levels = c("Z","Ailing","Excellent","Improved"))
    > status
    [1] Ailing    Improved  Excellent Z        
    Levels: Z < Ailing < Excellent < Improved
    

列表

  • 一般来说,列表就是一些对象(或成分, component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个 列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。

  • 创建一个列表

    > title<-"My First List" # 一个字符串
    > ages<-c(25,26,18,39)	#一个数值型向量
    > dat<-matrix(1:10,nrow=5) # 一个矩阵
    > k<-c("one","two","three")  # 一个字符型向量
    > mylist<-list(title=title,ages=ages,dat,k) # list 组合任意多个对象,并将它们保存为一个列表
    > mylist
    $title
    [1] "My First List"
    
    $ages
    [1] 25 26 18 39
    
    [[3]]
         [,1] [,2]
    [1,]    1    6
    [2,]    2    7
    [3,]    3    8
    [4,]    4    9
    [5,]    5   10
    
    [[4]]
    [1] "one"   "two"   "three"
    
  • 索引

    > mylist$title
    [1] "My First List"
    > mylist[[1]]
    [1] "My First List"
    
    > mylist[[3]]
         [,1] [,2]
    [1,]    1    6
    [2,]    2    7
    [3,]    3    8
    [4,]    4    9
    [5,]    5   10
    > mylist[[3]][2,1] # 对列表mylist的第三个对象矩阵进行索引 [第几行,第几列]
    [1] 2
    > mylist[[3]][,2] # 第二列
    [1]  6  7  8  9 10
    > mylist[[3]][1,] # 第一行
    [1] 1 6
    

以下是这门语言中你需要了解 的一些特性:

 对象名称中的句点(.)没有特殊意义。但美元符号( ) 却 有 着 和 其 他 语 言 中 的 句 点 类 似 的 含 义 , 即 指 定 一 个 对 象 中 的 某 些 部 分 。 例 如 , A )却有着和其他语言中的句点 类似的含义,即指定一个对象中的某些部分。例如,A Ax是指数据框A中的变量x。

 R不提供多行注释或块注释功能。你必须以#作为多行注释每行的开始。出于调试目的,
你也可以把想让解释器忽略的代码放到语句

if(FALSE){... }

中。将FALSE改为TRUE 即允许这块代码执行。

 将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素时,R将自动扩展这 个数据结构以容纳新值。举例来说,考虑以下代码:

> x<-c(1,2,3)
> x[6]<-19
> x
[1]  1  2  3 NA NA 19

通过赋值,向量x由三个元素扩展到了七个元素。 x <- x[1:3]会重新将其缩减回三个元素。

> x<-x[1:3]
> x
[1] 1 2 3

 R中没有标量。标量以单元素向量的形式出现。  R中的下标不从0开始,而从1开始。在上述向量中,x[1]的值为8。  变量无法被声明。它们在首次被赋值时生成

数据框

  • 由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更 为一般。它与你通常在SAS、SPSS和Stata中看到的数据集类似。数据框将是你在R中常处理的 数据结构。

  • 由于数据有多种模式,无法将此数据 集放入一个矩阵。在这种情况下,使用数据框是佳选择。

  • 数据框可通过函数data.frame()创建

    > patientID<-c(1,2,3,4)
    > age<-c(25,34,28,52)
    > diabetes<-c("Typel1","Typel2","Typel1","Typel1")
    > status<-c("Poor","Improved","Excellent","Poor")
    > patientdata<-data.frame(patientID,age,diabetes,status)
    > patientdata
      patientID age diabetes    status
    1         1  25   Typel1      Poor
    2         2  34   Typel2  Improved
    3         3  28   Typel1 Excellent
    4         4  52   Typel1      Poor
    
  • 选取数据框的元素

    > patientdata[1:2]
      patientID age
    1         1  25
    2         2  34
    3         3  28
    4         4  52
    > patientdata[c("diabetes","status")]
      diabetes    status
    1   Typel1      Poor
    2   Typel2  Improved
    3   Typel1 Excellent
    4   Typel1      Poor
    > patientdata$age
    [1] 25 34 28 52
    > table(patientdata$diabetes,patientdata$status)#提取元素制成列联表
            
             Excellent Improved Poor
      Typel1         1        0    2
      Typel2         0        1    0
    
  • 在每个变量名前都键入一次patientdata$可能会让人生厌,所以不妨走一些捷径。可以联 合使用函数attach()和detach()或单独使用函数with()来简化代码

    # attach detach
    # 函数attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名以后,将检查搜索路 径中的数据框,以定位到这个变量。以mtcars数据框为例,可以使用以下代码获取每 加仑行驶英里数(mpg)变量的描述性统计量,并分别绘制此变量与发动机排量(disp)和车身 重量(wt)的散点图:
    
    # 代码1:
    > plot(mtcars$mpg,mtcars$disp)
    > plot(mtcars$mpg,mtcars$wt) # 不给出结果,可自行运行
    
    # 代码2:
    > attach(mtcars)
    > plot(mpg,disp)
    > plot(mpg,wt)  # 结果和上一样
    > detach(mtcars)    #函数detach()将数据框从搜索路径中移除。值得注意的是,detach()并不会对数据框本身 做任何处理。这句是可以省略的,但其实它应当被例行地放入代码中,因为这是一个好的编程习惯。
    
     
    
    

    当名称相同时,attach 这种方法的局限性就很明显了

    > mpg<-c(1,2,3,4)
    > attach(mtcars)
    The following object is masked _by_ .GlobalEnv:
    
        mpg
    
    > plot(mpg,wt)
    Error in xy.coords(x, y, xlabel, ylabel, log) : 
      'x' and 'y' lengths differ
    > mpg
    [1] 1 2 3 4
    > mtcars$mpg
     [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2
    [11] 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9
    [21] 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
    [31] 15.0 21.4
    
    # 这里,在数据框mtcars被绑定(attach)之前,我们的环境中已经有了一个名为mpg的对象。 在这种情况下,原始对象将取得优先权,这与你想要的结果有所出入。由于mpg中有3个元素而 disp中有32个元素,故plot语句出错。函数attach()和detach()好在你分析一个单独的数 据框,并且不太可能有多个同名对象时使用。任何情况下,都要当心那些告知某个对象已被屏蔽 (masked)的警告。
    
    # with
    > with(mtcars,{plot(mpg,disp)
    + plot(mpg,wt)})  #在这种情况下,大括号{}之间的语句都针对数据框mtcars执行,这样就无须担心名称冲突 了。如果仅有一条语句,那么大括号{}可以省略。 
    
    #  函数with()的局限性在于,赋值仅在此函数的括号内生效
    > with(mtcars,{stats<-summary(mpg)
    + stats})
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      10.40   15.43   19.20   20.09   22.80   33.90 
    > stats
    错误: 找不到对象'stats'
    
    # 如果你需要创建在with()结构以外存在的对象,使用特殊赋值符<<-替代标准赋值符(<-) 即可,它可将对象保存到with()之外的全局环境中。
    > with(mtcars,stats<<-summary(mpg))
    > stats
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      10.40   15.43   19.20   20.09   22.80   33.90
    
    
    

索引、条件选择、数据框的索引

  • 此部分与大部分编程语言相似

分组数据和数据框

  • > energy  # library("ISwR")
       expend stature
    1    9.21   obese
    2    7.53    lean
    3    7.48    lean
    4    8.08    lean
    5    8.09    lean
    6   10.15    lean
    7    8.40    lean
    8   10.88    lean
    9    6.13    lean
    10   7.90    lean
    11  11.51   obese
    12  12.79   obese
    13   7.05    lean
    14  11.85   obese
    15   9.97   obese
    16   7.48    lean
    17   8.79   obese
    18   9.69   obese
    19   9.68   obese
    20   7.58    lean
    21   9.19   obese
    22   8.11    lean
    > exp.lean<-energy$expend[energy$stature=="lean"]
    > exp.lean
     [1]  7.53  7.48  8.08  8.09 10.15  8.40 10.88  6.13  7.90
    [10]  7.05  7.48  7.58  8.11
    
  • # 也可以使用 split 根据分组生成一系列向量
    > ll <- split(energy$expend,energy$stature)
    > ll
    $lean
     [1]  7.53  7.48  8.08  8.09 10.15  8.40 10.88  6.13  7.90
    [10]  7.05  7.48  7.58  8.11
    
    $obese
    [1]  9.21 11.51 12.79 11.85  9.97  8.79  9.69  9.68  9.19
    
    

隐式循环

  • 循环的一个常用功能是把一个函数应用到一组值或向量中的每一个元素,并将结果返回到一个单式i结构中

  • 求数据集 thuesen 每一向量的均值

    > lapply(thuesen, mean,na.rm=T)
    $blood.glucose
    [1] 10.3
    
    $short.velocity
    [1] 1.325652
    
    > sapply(thuesen, mean,na.rm=T)
     blood.glucose short.velocity 
         10.300000       1.325652 
    
    # 我们可以清楚的看到 函数 lappy 和 sapply 的区别
    
  • # apply
    > m<-matrix(rnorm(12),4)
    > m
                 [,1]       [,2]       [,3]
    [1,]  0.007725124  0.4546254 -1.9584613
    [2,] -1.218245008 -0.3267141 -0.6343796
    [3,]  1.499082717  3.3800043  0.3815516
    [4,]  1.210189647 -1.9498840 -1.1557917
    > apply(m, 1, max) #取每一行的最大值
    [1]  0.4546254 -0.3267141  3.3800043  1.2101896
    > apply(m, 2, max) # 1:行   2:列    取每一列的最大值
    [1] 1.4990827 3.3800043 0.3815516
    

排序

  • sort 函数

    > ?sort
    sort(x, decreasing = FALSE, ...)
    
    ## Default S3 method:
    sort(x, decreasing = FALSE, na.last = NA, ...)
    
    sort.int(x, partial = NULL, na.last = NA, decreasing = FALSE,
             method = c("auto", "shell", "quick", "radix"), index.return = FALSE)
    
    # 通过上面的代码 我们可以很清楚的的sort的用法
    > intake$post
      [1] 3910 4220 3885 5160 5645 4680 5265 5975 6790 6900 7335
    > sort(intake$post) # 默认 升序 (decreasing = FALSE)
     [1] 3885 3910 4220 4680 5160 5265 5645 5975 6790 6900 7335
    
  • order

    > ?order
    order returns a permutation which rearranges its first argument into ascending or descending order, breaking ties by further arguments. 
    sort.list is the same, using only one argument.
    # order返回一个排列,该排列将其第一个参数重新排列为升序或降序,并通过进一步的参数断开关系。
    # 排序列表相同,只使用一个参数。
    order(..., na.last = TRUE, decreasing = FALSE,
          method = c("auto", "shell", "radix"))
    
    sort.list(x, partial = NULL, na.last = TRUE, decreasing = FALSE,
              method = c("auto", "shell", "quick", "radix"))
    
    > order(intake$post)
     [1]  3  1  2  6  4  7  5  8  9 10 11
    > order(intake$post,decreasing = TRUE)
     [1] 11 10  9  8  5  7  4  6  2  1  3
    
    # 我们可以通过 order 获得的序号去索引相应的值
     
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值