搜索
查看: 826|回复: 0

[R] 慧美——R for data science 第15章 向量

[复制链接]

39

主题

40

帖子

295

积分

中级会员

Rank: 3Rank: 3

积分
295
发表于 2018-11-29 11:15:57 | 显示全部楼层 |阅读模式
R for data science   第15章  向量
15.1 简介
  • 向量特别重要,因为绝大多数自定义函数都要使用向量。也可以直接编写使用 tibble 的函数(比如 ggplot2 和 dplyr 中的函数)

15.2 向量基础
  • 向量的类型主要有两种
    • 原子向量,其共有 6 种类型:逻辑型、整型、双精度型、字符型、复数型和原始型。整 型和双精度型向量又统称为数值型向量。
    • 列表,有时又称为递归向量,因为列表中也可以包含其他列表。

  • 原子向量与列表之间的主要区别是,原子向量中的各个值都是同种类型的,而列表中的各 个值可以是不同类型的。
  • NULL 是一个与向量相关的对象,用于表示空向量(与表示向量中 的一个值为空的 NA 不同),通常指长度为 0 的向量。
  • 每个向量都有两个关键属性
    • 类型。你可以使用 typeof() 函数来确定向量的类型


  • 长度。你可以使用 length() 函数来确定向量的长度

  • 可以向向量中任意添加额外的元数据,这些元数据称为特性。特性可以用来创建扩展向 量,以执行一些新的操作。
  • 扩展向量有 4 种类型
    • 基于整型向量构建的因子。
    • 基于数值型向量构建的日期和日期时间。
    • 基于列表构建的数据框和 tibble。


15.3 重要的原子向量
  • 逻辑型
    • 只有 3 个可能的取值:FALSE、TRUE 和 NA。
    • 一般可以通过比较运算符来构建逻辑向量, 可以通过 c() 函数来手工创建逻辑向量

  • 数值型
    • 整型与双精度型向量统称为数值型向量。R 中默认数值是双精度型的。如果想要创建整型数值,可以在数字后面加一个 L


  • 双精度型是近似值。双精度型表示的是浮点数,不能由固定数量的内存精确表示。
    • 整型数据都有1个特殊值NA,而双精度型数据则有4个特殊值:NA, NaN, Inf, -Inf
    • 应该使用辅助函数 is.finite()、is.infinite() 和 is.nan()来检查这些特殊值

  • 字符型
    • 每个元素都是一个字符串,而字符串可以包含任意数量的数据。
    • R 使用的是全局字符串池。这意味着每个唯一的字符串在内存中只保存一次,每次对这个字符串的使用都指向这段内存,这样可以减少复制字符串所需的内存空间。

  • 缺失值
    • 每种类型的原子向量都有自己的缺失值


15.4 使用原子向量
  • 原子向量的几种重要操作
    • 如何将一种原子向量转换为另一种,以及何时系统会自动转换。
    • 如何分辨出一个对象是哪种特定类型的向量。
    • 在处理长度不同的向量时,会发生什么情况。
    • 如何命名向量中的元素。
    • 如何提取出感兴趣的元素。


  • 强制转换
    • 将一种类型的向量强制转换成另一种类型的方式有两种
      • 显 式 强 制 转 换: 当 调 用 as.logical()、as.integer()、as.double() 或 as.character()
      • 隐式强制转换:当在特殊的上下文环境中使用向量,而这个环境又要求使用特定类型的 向量时,就会发生隐式强制转换。
        • 在数值环境中使用逻辑向量。这种情况下, TRUE 转换为 1,FALSE 转换为 0。这意味着对逻辑向量求和的结果就是其中真值的个数,逻 辑向量的均值就是其中真值的比例。

      • 有些代码使用了反向的隐式强制转换,即从整型转换为逻辑型



  • 当试图使用 c() 函数来创建包含多种类型元素的向量时,清楚如何进行类型转换也是非常重要的。这时总是会统一转换为最复杂的元素类型

  • 原子向量中不能包含不同类型的元素,因为类型是整个向量的一种属性,不是其中单个元素的属性。如果需要在同一个向量中包含混合类型的元素,那么就需要使用列表
  • 检验函数
    • 我们需要根据向量的类型进行不同的操作。检验向量类型的一种方法是使用 typeof()函数,另一种方法是使用检验函数来返回 TRUE 或 FALSE
    • 使用 purrr 包提供的 is_* 函数族


  • 标量与循环规则
    • R 可以隐式地对向量类型进行强制转换,同样地,也可以对向量长度进行强制转换。这种转换称为向量循环,因为 R 会将较短的向量重复(或称循环)到与较长的向量相同的长度。 混合使用向量和“标量”时,向量循环是最有用的。我们在标量上加了引号,因为 R 中没有真正的标量,只有长度为 1 的向量。正因为没有标量,所以 R 的多数内置函数都是向量化的,即可以在数值的一个向量上进行操作。
    • 如果两个长度相同的向量相加,或者一个向量和一个“标量”相加,那么结果是显而易见的,但是,如果两个长度不同的向量相加,这里 R 会扩展较短的向量,使其与较长的向量一样长,这个过程就称作向量循环。
    • 如果确实想要执行向量循环,那么你需要使用 rep() 函数手工完成


  • 向量命名
    • 所有类型的向量都是可以命名的。你可以在使用 c() 函数创建向量时进行命名
    • 也可以在向量创建完成后,使用 purrr::set_names() 函数来命名


  • 向量取子集
    • 可以使用 dplyr::filter() 函数在 tibble 中筛选行。但 filter() 函数只能筛tibble,因此要想筛选向量,我们需要使用一个新工具:[。[ 就是取子集函数,调用形式是 x[a]
    • 使用仅包含整数的数值向量。整数要么全部为正数,要么全部为负数,或者为 0。


  • 取子集的最简方式就是什么都不写:x[],这样就会返回 x 中的全部元素。这种方式对 于向量取子集没有什么用处,但对于矩阵(或其他高维数据结构)取子集则非常重要, 因为这样可以取出所有的行或所有的列,只要将行或列保持为空即可。
    • 如果 x 是 二维的,那么x[1, ]可以选取出第1行和所有列
    • x[, -1]则可以选取出所有行和除第 1 列外的所有列。


15.5 递归向量(列表)
  • 列表是建立在原子向量基础上的一种复杂形式,因为列表中可以包含其他列表。这种性质使得列表特别适合表示层次结构或树形结构。你可以使用 list() 函数创建列表
  • 在处理列表时,str() 函数是一个非常有用的工具,因为其重点关注列表结构

  • list() 中可以包含不同类型的对象

  • 列表可视化
    • 为了解释清楚更复杂的列表操作函数,列表的可视化表示大有裨益

  • 列表取子集
    • 列表取子集有 3 种方式
      • 使用 [ 提取子列表。这种方式的结果总是一个列表
      • 可以使用逻辑向量、整数向量或字符向量来提取子列表。
      • 使用 [[ 从列表中提取单个元素。这种方式会从列表中删除一个层次等级



  • $ 是提取列表命名元素的简单方式,其作用与 [[ 相同,只是不需要使用括号
    • 对于列表来说,[ 和 [[ 之间的区别是非常重要的,因为 [[ 会使列表降低一个层级,而[ 则会返回一个新的、更小的列表。


15.6 特性
  • 任何向量都可以通过其特性来附加任意元数据。你可以将特性看作可以附加在任何对象上的一个向量命名列表。可以使用 attr() 函数来读取和设置单个特性值,也可以使用attributes() 函数同时查看所有特性值
  • 3 种特别重要的特性可以用来实现 R 中的基础功能
    • 名称:用于命名向量元素。
    • 维度:使得向量可以像矩阵或数组那样操作。
    • 类:用于实现面向对象的 S3 系统。

  • 最重要的 S3 泛型函数是 print():当在控制台中输入对象名称时,print() 可以决定如何输出这个对象。其他重要的泛型函数是取子集函数 [、[[ 和 $。

15.7 扩展向量
  • 原子向量和列表是最基础的向量,使用它们可以构建出另外一些重要的向量类型,比如因子和日期。我们称构建出的这些向量为扩展向量,因为它们具有附加特性,其中包括类。
  • 4 种重要 的扩展向量。
    • 因子:因子是设计用来表示分类数据的,只能在固定集合中取值。因子是在整型向量的基础上构建的,添加了水平特性

    • 日期:R 中的日期是一种数值型向量,表示从 1970 年 1 月 1 日开始的天数
    • 日期时间:日期时间是带有 POSIXct 类的数值型向量,表示从 1970 年 1 月 1 日开始的秒数(POSIXct表示“可移植操作系统接口”日历时间)
    • tibble
      • tibble 是扩展的列表,有 3 个类:tbl_df、tbl 和 data.frame。它的特性有 2 个列)
        names 和 row.names







上一篇:慧美——R for data science 第22章 R Markdown输出类型
下一篇:慧美——R for data science 第16章 使用purrr实现迭代
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-11-20 00:47 , Processed in 0.042600 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.