首页 > > > 【R语言】tidyverse之三:数据连接
数据分析经常会涉及多个数据表,也称为关系数据库。关系是指两个数据表之间的关系,更多数据表之间的关系总可以表示为两两之间的关系。
一个项目的数据,通常都是用若干数据表分别存放,它们之间通过"键"连接在一起,根据数据分析的需要,通过键匹配进行数据连接。
例如,机场航班数据的连接结构:

键列(可以不止 1 列),能够唯一识别自己或别人数据表的每一个观测。要判断某(些)列是否是键,可以先用 count() 计数,再看是否没有 n > 1 出现:
library(nycflights13)
planes %>%
count(tailnum) %>%
filter(n > 1)
weather %>%
count(year, month, day, hour, origin) %>%
filter(n > 1)
合并数据框最基本的方法是:
分别用 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之一:读写数据
只介绍最常用的四种合并,先准备数据集:
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
外连接至少保留一个数据表中的所有观测,其中最常用的是左连接:保留 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 具有相同的变量,并将观测看成是集合中的元素:
参考文献:
__________________________________
转载请注明,禁止用于出版。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3132828/ ,如需转载,请注明出处,否则将追究法律责任。