搜索
查看: 708|回复: 0

[R] 慧美——R for data science 第九章 使用dplyr处理关系数据

[复制链接]

39

主题

40

帖子

292

积分

中级会员

Rank: 3Rank: 3

积分
292
发表于 2018-11-11 20:17:40 | 显示全部楼层 |阅读模式
R for data science  第九章  使用dplyr处理关系数据


9.1  简介
  • 有很多个数据表,而且必须综合使用它们才能回答你所感兴趣的问题。存在于多个表中的这种数据统称为关系数据,因为重要的是数据间的关系,而不是单个数据集。
  • 设计了三类操作来处理关系数据。

    • 合并连接:向数据框中加入新变量,新变量的值是另一个数据框中的匹配观测。
    • 筛选连接:根据是否匹配另一个数据框中的观测,筛选数据框中的观测。
    • 集合操作:将观测作为集合元素来处理。

  • 关系数据最常见于关系数据库管理系统(relational database management system,RDBMS),该系统几乎囊括了所有的现代数据库。

    • dplyr 要比 SQL 更容易使用,因为前者是专门用于进行数据分析的。
    • 在进行常用的数据分析操作时,dplyr 非常得心应手,反之,它并不擅长数据分析中不常用的那些操作。
    • 准备工作


library(tidyverse)
library(nycflights13)9.2  nycflights13
  • 使用 nycflights13 包来学习关系数据。nycflights13 中包含了与 flights 相关的 4 个 tibble
  • 展示不同数据表之间关系的一种方法是绘制图形。
  • 记住每种关系只与两张表有关。不需要弄清楚所有的事情,只要明白你所关心的表格间的关系即可。

9.3  键
  • 用于连接每对数据表的变量称为键。键是能唯一标识观测的变量(或变量集合)。
  • 简单情况下,单个变量就足以标识一个观测
  • 键的类型有两种。

    • 主键:唯一标识其所在数据表中的观测。
    • 外键:唯一标识另一个数据表中的观测。

  • 一个变量既可以是主键,也可以是外键。
  • 一旦识别出表的主键,最好验证一下,看看它们能否真正唯一标识每个观测。一种验证方法是对主键进行 count() 操作,然后查看是否有 n 大于 1 的记录
  • 有时数据表没有明确的主键:每行都是一个观测,但没有一个变量组合能够明确地标识 它。
  • 如果一张表没有主键,有时就需要使用 mutate() 函数和 row_number() 函数为表加上一个主键。这样一来,如果你完成了一些筛选工作,并想要使用原始数据检查的话,就可以更容易地匹配观测。这种主键称为代理键。
  • 主键与另一张表中与之对应的外键可以构成关系。关系通常是一对多的。

9.4 合并连接
  • 用于组合两个表格的第一种工具,即合并连接。合并连接可以将两个表格中的变量组合起来,它先通过两个表格的键匹配观测,然后将一个表格中的变量复制到另一个表格中。
  • 和 mutate() 函数一样,连接函数也会将变量添加在表格的右侧,因此如果表格中已经有了很多变量,那么新变量就不会显示出来。(还可以使用 View() 来解决这个问题)
  • 内连接是最简单的一种连接。只要两个观测的键是相等的,内连接就可以匹配它们

    • 内连接最重要的性质是,没有匹配的行不会包含在结果中。这意味着内连接一般不适合在分析中使用,因为太容易丢失观测了。
    • 内连接的结果是一个新数据框,其中包含键、x 值和 y 值。我们使用 by 参数告诉 dplyr 哪个变量是键
    • x%>%
      inner_join(y, by="key")
      #> # A tibble: 2 × 3
      #>     key val_x val_y
      #>   <dbl> <chr> <chr>
      #> 1     1   x1   y1
      #> 2     2   x2   y2
  • 外连接则保留至少存在于一个表中的观测。

    • 外连 接有 3 种类型。

      • 左连接:保留 x 中的所有观测。
      • 右连接:保留 y 中的所有观测
      • 全连接:保留 x 和 y 中的所有观测。

    • 最常用的连接是左连接:只要想从另一张表中添加数据,就可以使用左连接,因为它会保留原表中的所有观测,即使它没有匹配。左连接应该是你的默认选择,除非有足够充分的理由选择其他的连接方式。
    • 当键不能唯一标识观测时,维恩图无法表示这种情况
    • 重复键

      • 一张表中具有重复键。通常来说,当存在一对多关系时,如果你想要向表中添加额外信息,就会出现这种情况。
      • 两张表中都有重复键。这通常意味着出现了错误,因为键在任意一张表中都不能唯一标识观测。当连接这样的重复键时,你会得到所有可能的组合,即笛卡儿积



file:///Users/huimei/Library/Application%20Support/typora-user-images/image-20181111170854387.png?lastModify=1541938095
  • 两张表都是通过一个单变量来连接的,而且这个变量在两张表中具有同样的名称。这种限制条件是通过by = "key"来实现的。你还可以对by设置其他值,以另外的方式来连接表。

    • 默认值by = NULL。这会使用存在于两个表中的所有变量,这种方式称为自然连接。
    • 字符向量by = "x"。这种方式与自然连接很相似,但只使用某些公共变量。例如,flights 和 planes 表中都有 year 变量,但是它们的意义不同,因此我们只通过 tailnum进行连接


筛选连接
  • 筛选连接匹配观测的方式与合并连接相同,但前者影响的是观测,而不是变量。筛选连接有两种类型。
    • semi_join(x, y) #保留 x 表中与 y 表中的观测相匹配的所有观测。
    • anti_join(x, y) #丢弃 x 表中与 y 表中的观测相匹配的所有观测。
  • 使用半连接,它可以像合并连接一样连接两个表,但不添加新列,而是保留 x表中那些可以匹配 y 表的行。重要的是存在匹配,匹配了哪条观测则无关紧要。这说明筛选连接不会像合并连接那样造成重复的行。
  • 半连接的逆操作是反连接。反连接保留 x 表中那些没有匹配 y 表的行。反连接可以用于诊断连接中的不匹配。

9.6 连接中的问题
  • 首先,需要找出每个表中可以作为主键的变量。一般应该基于对数据的理解来确定主 键,而不是凭经验寻找能作为唯一标识符的变量组合。
  • 确保主键中的每个变量都没有缺失值。如果有缺失值,那么这个变量就不能标识观测!
  • 检查外键是否与另一张表的主键相匹配。最好的方法是使用 anti_join(),由于数据录 入错误,外键和主键不匹配的情况很常见。解决这种问题通常需要大量工作。
  • 如果键中确实有缺失值,那么你就要深思熟虑一下,是应该使用内连接还是外连接,此外,是否应该丢弃那些没有匹配记录的行。

9.7 集合操作
  • 所有集合操作都是作用于整行的,比较的是每个变量的值。集合操作需要 x 和 y 具有相同的变量,并将观测按照集合来处理。

intersect(x, y) #返回既在 x 表,又在 y 表中的观测。
union(x, y) #返回 x 表或 y 表中的唯一观测。
setdiff(x, y) #返回在 x 表,但不在 y 表中的观测。

   




上一篇:第17章
下一篇:Markdown + pandoc
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-10-22 23:00 , Processed in 0.027449 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.