ITPub博客

首页 > > > 【R语言】tidyverse之三:数据连接

【R语言】tidyverse之三:数据连接

作者:浪花小雨滴 时间:2020-06-17 10:47:51 0 删除 编辑

一. 数据连接简介

数据分析经常会涉及多个数据表,也称为关系数据库。关系是指两个数据表之间的关系,更多数据表之间的关系总可以表示为两两之间的关系。

一个项目的数据,通常都是用若干数据表分别存放,它们之间通过"键"连接在一起,根据数据分析的需要,通过键匹配进行数据连接。

例如,机场航班数据的连接结构:

键列(可以不止 1 列),能够唯一识别自己或别人数据表的每一个观测。要判断某(些)列是否是键,可以先用 count() 计数,再看是否没有 n > 1 出现:

library(nycflights13)
planes %>%
  count(tailnum) %>%
  filter(n > 1)
weather %>%
  count(year, month, day, hour, origin) %>%
  filter(n > 1)

二. 合并行与合并列

合并数据框最基本的方法是:

  • 合并行:下方堆叠新行,根据列名匹配列,注意列名相同,否则作为新列(NA填充);
  • 合并列:右侧拼接新列,根据位置匹配行,行数必须相同。

分别用 dplyr 包中的 bind_rows() 和 bind_cols() 实现,其优点是可以一次接受多个数据框。

bind_rows(
+   sample_n(iris, 10),
+   sample_n(iris, 10),
+   sample_n(iris, 10)
+ ) %>% glimpse()
bind_cols(
  sample_n(iris, 10),
  sample_n(iris, 10),
  sample_n(iris, 10)
) %>% glimpse()

有时候,是在批量导入数据的同时做合并行/合并列,用 purrr 包中的 map_dfr() 和 map_dfc() 实现:

map_dfr(.x, .f, .id = "id_col")
map_dfc(.x, .f)

应用函数 .f 到列表或向量 .x 的每个元,再将每个结果做“行合并/合并列”创建数据框,前者可增加新列 id_col 描述该行来自哪个文件。具体实例可参考:

张敬信:【R语言】tidyverse之一:读写数据​zhuanlan.zhihu.com图标

三. 根据值匹配合并数据框

只介绍最常用的四种合并,先准备数据集:

superheroes <- tribble(
  ~name,      ~alignment,  ~gender,   ~publisher,
  "Magneto",  "bad",       "male",    "Marvel",
  "Storm",    "good",      "female",  "Marvel",
  "Mystique", "bad",       "female",  "Marvel",
  "Batman",   "good",      "male",    "DC",
  "Joker",    "bad",       "male",    "DC",
  "Catwoman", "bad",       "female",  "DC",
  "Hellboy",  "good",      "male",    "Dark Horse Comics"
)
superheroes
publishers <- tribble(
  ~publisher, ~yr_founded,
  "DC",       1934L,
  "Marvel",   1939L,
  "Image",    1992L
)
publishers


  1. 左连接:left_join()

外连接至少保留一个数据表中的所有观测,其中最常用的是左连接:保留 x 所有行,合并匹配的 y 中的列。

superheroes %>% 
  left_join(publishers, by="publisher")

注:若两个表中的键列列名不同,用 by=c("name1"="name2").


2. 内连接:inner_join()

内连接是保留两个数据表中所共有的观测:只保留 x 中与 y 匹配的行,合并匹配的 y 中的列。

inner_join(superheroes, publishers, by="publisher")


3. 半连接:semi_join()

根据在 y 中,来筛选 x 中的行。

superheroes %>%
  semi_join(publishers, by="publisher")

4. 反连接:anti_join()

根据不在 y 中,来筛选 x 中的行。

superheroes %>%
  anti_join(publishers, by="publisher")

四. 集合运算

集合运算有时候很有用,都是针对所有行,通过比较变量的值来实现。这就需要数据表 x 和 y 具有相同的变量,并将观测看成是集合中的元素:

  • intersect(x, y):返回 x 和 y 共同包含的观测;
  • union(x, y):返回 x 和 y 中所有的(唯一)观测;
  • setdiff(x, y):返回在 x 中但不在 y 中的观测。


参考文献:

  1. Garrett Grolemund, Hadley Wickham. R for Data Science. r4ds.had.co.nz/
  2. Desi Quintans, Jeff Powell. Working in the Tidyverse. hiercourse.com/
  3. STAT 545: Chapter 15 Join two tables. Chapter 15 Join two tables | STAT 545


__________________________________

转载请注明,禁止用于出版。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3132828/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40480