搜索
查看: 74|回复: 0

[R] 慧美——R for data science第三章-使用dplyr进行数据转换

[复制链接]

10

主题

10

帖子

100

积分

注册会员

Rank: 2

积分
100
发表于 2018-11-6 15:37:02 | 显示全部楼层 |阅读模式
        R for data science第三章-使用dplyr进行数据转换3.1 简介
  • 学会用dplyr包来转换数据
  • tidyverse中另一个核心R包-dplyr包
  • 如果想要在加载 dplyr 后使用这些函数的基础版本,那么你应该使用它们的完整名称:stats::filter() 和stats::lag()
  • 要想看到整个数据集,可以使用 View(flights) 在 RStudio查看器中打开数据集。
  • tibble 也是一种数据框,只是进行了一些小小的修改,使其更适合在 tidyverse 中使用
  • 每个变量的类型
    • int 表示整数型变量。
    • dbl 表示双精度浮点数型变量,或称实数。
    • chr 表示字符向量,或称字符串。
    • dttm 表示日期时间(日期 + 时间)型变量。
    • lgl 表示逻辑型变量,是一个仅包括 TRUE 和 FALSE 的向量。
    • fctr 表示因子,R 用其来表示具有固定数目的值的分类变量。
    • date 表示日期型变量。

  • dplyr核心函数
    • 按值筛选观测(filter())。
    • 对行进行重新排序(arrange())。
    • 按名称选取变量(select())。
    • 使用现有变量的函数创建新变量(mutate())。
    • 将多个值总结为一个摘要统计量(summarize())。
    • 这些函数都可以和 group_by() 函数联合起来使用,group_by() 函数可以改变以上每个函数 的作用范围,让其从在整个数据集上操作变为在每个分组上分别操作。
    • 前面 5 个函数的工作方式都是相同的。
      (1) 第一个参数是一个数据框。
      (2) 随后的参数使用变量名称(不带引号)描述了在数据框上进行的操作。
      (3) 输出结果是一个新数据框。


3.2 使用filter()筛选行
  • filter() 函数可以基于观测的值筛选出一个观测子集。第一个参数是数据框名称,第二个参数以及随后的参数是用来筛选数据框的表达式。
  • R 要么输出结果,要么将结果保存在一个变量中。如果想同时完成这两种操作,那么你可 以用括号将赋值语句括起来
    == 而非 =

  • 比较运算符:>、>=、<、<=、!=(不等于)和 ==(等于)
  • 计算机使用的是有限精度运算(显然无法存储无限位的数),因此请记住,你看到的每个数都是一个近似值。比较浮点数是否相等时,不能使用 ==,而应该使用 near()

  • filter() 中的多个参数是由“与”组合起来的:每个表达式都必须为真才能让一行观测包 含在输出中。如果要实现其他类型的组合,你需要使用布尔运算符:& 表示“与”、| 表示 “或”、! 表示“非”。
    • 找出 11 月或 12 月出发的所有航班
      • filter(flights, month == 11 | month == 12)nov_dec <- filter(flights, month %in% c(11, 12)) #x %in% y。这会选取出x是y中的一个值时的所有行
    • 如果想要找出延误时间(到达或出发)不多于2小时的航班
      filter(flights, !(arr_delay > 120 | dep_delay > 120))filter(flights, arr_delay <= 120, dep_delay <= 120)
    • 缺失值,或称 NA(not available,不可用)。NA 表示未知的值,因此缺失值是“可传染的”。如果运算中包含了未知值,那么运算结果一般来说也是个未知值:
      NA > 5
      #> [1] NA
      10 == NA
      #> [1] NA
      NA + 10
      #> [1] NA
      NA / 2
      #> [1] NA
    • 如果想要确定一个值是否为缺失值,可以使用 is.na() 函数:
      is.na(x)
      #> [1] TRUE
      filter() 只能筛选出条件为 TRUE 的行;它会排除那些条件为 FALSE 和 NA 的行。如果想保留缺失值,可以明确指出


3.3 使用arrange()排列行
arrange() 函数的工作方式与 filter() 函数非常相似,但前者不是选择行,而是改变行的顺序。它接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排序
  • 使用 desc() 可以按列进行降序排序,缺失值总是排在最后

3.4 使用select()选择列
  • select() 函数可以让你快速生成一个有用的变量子集。
    select(flights, year, month, day)# 按名称选择列select(flights, year:day)# 选择“year”和“day”之间的所有列(包括“year”和“day”)select(flights, -(year:day))#选择不在“year”和“day”之间的所有列(不包括“year”和“day”)starts_with("abc"):匹配以“abc”开头的名称。ends_with("xyz"):匹配以“xyz”结尾的名称。contains("ijk"):匹配包含“ijk”的名称。matches("(.)\\1"):选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有重复字符的变量。num_range("x", 1:3):匹配 x1、x2 和 x3。
  • select() 可以重命名变量, 更多使用rename()函数来重命名变量,以保留所有未明确提及的变量
    • 将 select() 函数和 everything() 辅助函数结合起来使用。当想要将几个变量移到数据框开头时


3.5 使用mutate()添加新变量
  • mutate() 总是将新列添加在数据集的最后,因此我们需要先创建一个更狭窄的数据集,以便能够看到新变量。
  • 记住,当使用 RStudio 时,查看所有列的最简单的方法就是使用 View()函数

  • 如果只想保留新变量,可以使用 transmute() 函数

  • 常用创建函数
    • 创建新变量的多种函数可供你同 mutate() 一同使用。最重要的一点是,这种函数必须是向量化的:它必须接受一个向量作为输入,并返回一个向量作为输出,而且输入向量与输出向量具有同样数目的分量。
    • 算术运算符:+、-、*、/、^
      • 如果一个参数比另一个参数短,那么前者会自动扩展到同样的长度。
      • 当某个参数是单个数值时,这种方式是最有效的
        • 聚集函数结合起来使用。
          • 例如,x /sum(x)可以计算出各个分量在总数中的比例
          • y – mean(y)可以计算出分量与均值之间的差值。



    • 模运算符:%/% 和 %%
      • %/%(整数除法)和%%(求余)

    • 对数函数:log()、log2() 和 log10()
      • 在处理取值范围横跨多个数量级的数据时,对数是特别有用的一种转换方式。它还可以将乘法转换成加法
      • 推荐使用 log2() 函数,因为很容易对其进行解释:对数标度的数值增加 1 个单位,意味着初始数值加倍;减少 1 个单位,则意味着初始数值减半。

    • 偏移函数
      • lead() 和 lag() 函数可以返回一个序列的领先值和滞后值。它们可以计算出序列的移动差值(如x – lag(x))或发现序列何时发生了变化(x != lag(x))。它们与group_by()组合使用时特别有用



  • 累加和滚动聚合
    • R 提供了计算累加和、累加积、累加最小值和累加最大值的函数:cumsum()、cumprod()、commin() 和 cummax();dplyr 还提供了 cummean() 函数以计算累加均值。

  • 逻辑比较:<、<=、>、>= 和 !=
    • 如果需要进行一系列复杂的逻辑运算,那么最好将中间结果保存在新变量中,这样就可以检查是否每一步都符合预期。

  • 排秩
    • 默认的排秩方式是,最小的值获得最前面的名次,使用 desc(x) 可以让最大的值获得最前面的名次
    • 变体 row_number()、dense_rank()、percent_rank()、cume_dist() 和 ntile()


3.6 使用summarize()进行分组摘要
  • summarize(),它可以将数据框折叠成一行,与group()连用
  • group_by() 可以将分 析单位从整个数据集更改为单个分组。接下来,在分组后的数据框上使用 dplyr 函数时, 它们会自动地应用到每个分组。
  • group_by() 和 summarize() 的组合构成了使用 dplyr 包时最常用的操作之一:分组摘要。
  • 使用管道组合多种操作
    • 支持管道操作是 tidyverse 中的 R 包的核心原则之一。唯一的例外就是 ggplot2
    • 在阅读代码时,%>%最好读作“然后”。
    • 聚合函数遵循缺失值的一般规则:如果输入中有缺失值,那么输出也会是缺失值。好在所有聚合函数都有一个 na.rm 参数,它可以在计算前除去缺失值
    • 聚合操作中包括一个计数(n())或非缺失值的计数(sum(!is_na()))
    • RStudio 技巧:Ctrl+Shift+P 是非常有用的组合键,可以将上一次从编辑器发送到控制台的代码段重新发送一次。例如,当在上个示例中试验 n 的值时,使用这个组合键就特别方便。你可以使用 Ctrl+Enter 将整段代码发送到控制台,然后修改 n 的值,再按 Ctrl+Shift+P 就可以重新发送整段代码。

  • 位置度量
    • mean(x),但 median(x) 也非常有用。均值是总数除以个数;中位数则是这样一个值:50% 的 x 大于它,同时 50% 的 x 小于它。
    • 有时候需要将聚合函数和逻辑筛选组合起来使用。

  • 分散程度度量:sd(x)、IQR(x) 和 mad(x)
    • 均方误差(又称标准误差,standard deviation,sd)是分散程度的标准度量方式。四分位距 IQR() 和绝对中位差 mad(x) 基本等价,更适合有离群点的情况
    • 秩的度量:min(x)、quantile(x, 0.25) 和 max(x)
    • 定位度量:first(x)、nth(x, 2) 和 last(x)
      • 这几个函数的作用与 x[1]、x[2] 和 x[length(x)] 相同,只是当定位不存在时(比如尝试从只有两个元素的分组中得到第三个元素),前者允许你设置一个默认值。
        #行=观测,列=变量


  • 计数
    • n(),它不需要任何参数,并返回当前分组的大小。如果想要计算出非缺失值的数量,可以使用 sum(!is.na(x))。要想计算出唯一值的数量,可以使用 n_distinct(x)
    • count()

  • 逻辑值的计数和比例:sum(x > 10) 和 mean(y == 0)
    • 当与数值型函数一同使用时,TRUE 会转换为 1,FALSE 会转换为 0。这使得 sum() 和 mean()非常适用于逻辑值:sum(x) 可以找出 x 中 TRUE 的数量,mean(x) 则可以找出比例。

  • 按多个变量分组
    • 当使用多个变量进行分组时,每次的摘要统计会用掉一个分组变量。这样就可以轻松地对 数据集进行循序渐进的分析
    • 对分组求和的结果再求和就是对整体求和,但分组中位数的中位数可不是整体的中位数

  • 取消分组
    • 如果想要取消分组,并回到未分组的数据继续操作,那么可以使用 ungroup() 函数


3.7 分组新变量(和筛选器)
  • 与 summarize() 函数结合起来使用是最有效的,但分组也可以与 mutate() 和 filter() 函数结合,以完成非常便捷的操作
  • 分组筛选器的作用相当于分组新变量加上未分组筛选器。为了完成快速、粗略的数据处理,否则很难检查数据处理的结果是否正确。
    • 找出每个分组中最差的成员
    • 找出大于某个阈值的所有分组
    • 对数据进行标准化以计算分组指标






上一篇:慧美——R for data science第二章-工作流:基础
下一篇:1106 chapter 15
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2018-11-16 22:49 , Processed in 0.042564 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.