1、 功能概要
(1)标准的关联方式: inner, left, right, outer, semi, anti
(2)cross joins
(3)复杂的关联方式,如多字段关联,条件过滤等
2、代码样例
2.1、标准关联方式: inner, left, right, outer, semi, anti
using DataFrames
x = DataFrame(ID=[1,2,3,4,missing], name = ["Alice", "Bob", "Conor", "Dave","Zed"])
# 5×2 DataFrame
# │ Row │ ID │ name │
# │ │ Int64⍰ │ String │
# ├─────┼─────────┼────────┤
# │ 1 │ 1 │ Alice │
# │ 2 │ 2 │ Bob │
# │ 3 │ 3 │ Conor │
# │ 4 │ 4 │ Dave │
# │ 5 │ missing │ Zed │
y = DataFrame(id=[1,2,5,6,missing], age = [21,22,23,24,99])
# 5×2 DataFrame
# │ Row │ id │ age │
# │ │ Int64⍰ │ Int64 │
# ├─────┼─────────┼───────┤
# │ 1 │ 1 │ 21 │
# │ 2 │ 2 │ 22 │
# │ 3 │ 5 │ 23 │
# │ 4 │ 6 │ 24 │
# │ 5 │ missing │ 99 │
#默认是内连接,满足 x:ID=y:id 的数据才会展示, x,y交集。x,y的列都会展示
join(x, y, on=:ID=>:id)
# 3×3 DataFrame
# │ Row │ ID │ name │ age │
# │ │ Int64⍰ │ String │ Int64 │
# ├─────┼─────────┼────────┼───────┤
# │ 1 │ 1 │ Alice │ 21 │
# │ 2 │ 2 │ Bob │ 22 │
# │ 3 │ missing │ Zed │ 99 │
#左连接,以 x 连接 y, 行数与 x一致, x的全集。x,y的列都会展示
join(x, y, on=:ID=>:id, kind=:left)
# 5×3 DataFrame
# │ Row │ ID │ name │ age │
# │ │ Int64⍰ │ String │ Int64⍰ │
# ├─────┼─────────┼────────┼─────────┤
# │ 1 │ 1 │ Alice │ 21 │
# │ 2 │ 2 │ Bob │ 22 │
# │ 3 │ 3 │ Conor │ missing │
# │ 4 │ 4 │ Dave │ missing │
# │ 5 │ missing │ Zed │ 99 │
#右连接,以 y 连接 x, 行数与 y一致,y的全集。x,y的列都会展示
join(x, y, on=:ID=>:id, kind=:right)
# 5×3 DataFrame
# │ Row │ ID │ name │ age │
# │ │ Int64⍰ │ String⍰ │ Int64 │
# ├─────┼─────────┼─────────┼───────┤
# │ 1 │ 1 │ Alice │ 21 │
# │ 2 │ 2 │ Bob │ 22 │
# │ 3 │ missing │ Zed │ 99 │
# │ 4 │ 5 │ missing │ 23 │
# │ 5 │ 6 │ missing │ 24 │
#外连接, x,y的并集.x,y的列都会展示
join(x, y, on=:ID=>:id, kind=:outer)
# 7×3 DataFrame
# │ Row │ ID │ name │ age │
# │ │ Int64⍰ │ String⍰ │ Int64⍰ │
# ├─────┼─────────┼─────────┼─────────┤
# │ 1 │ 1 │ Alice │ 21 │
# │ 2 │ 2 │ Bob │ 22 │
# │ 3 │ 3 │ Conor │ missing │
# │ 4 │ 4 │ Dave │ missing │
# │ 5 │ missing │ Zed │ 99 │
# │ 6 │ 5 │ missing │ 23 │
# │ 7 │ 6 │ missing │ 24 │
#半连接,以 x 连接 y, x中存在,y中也存在的,但是只展示 x中的列, x的子集。
join(x, y, on=:ID=>:id, kind=:semi)
# 3×2 DataFrame
# │ Row │ ID │ name │
# │ │ Int64⍰ │ String │
# ├─────┼─────────┼────────┤
# │ 1 │ 1 │ Alice │
# │ 2 │ 2 │ Bob │
# │ 3 │ missing │ Zed │
#反连接,以 x 连接 y, x中存在,y中不存在的, 但是只展示 x中的列, x的子集。
join(x, y, on=:ID=>:id, kind=:anti)
# 2×2 DataFrame
# │ Row │ ID │ name │
# │ │ Int64⍰ │ String │
# ├─────┼────────┼────────┤
# │ 1 │ 3 │ Conor │
# │ 2 │ 4 │ Dave │
2.2 cross 关联
#笛卡尔积的关联
join(DataFrame(x=[1,2,3]), DataFrame(y=["a","b","c"]), kind=:cross)
# 9×2 DataFrame
# │ Row │ x │ y │
# │ │ Int64 │ String │
# ├─────┼───────┼────────┤
# │ 1 │ 1 │ a │
# │ 2 │ 1 │ b │
# │ 3 │ 1 │ c │
# │ 4 │ 2 │ a │
# │ 5 │ 2 │ b │
# │ 6 │ 2 │ c │
# │ 7 │ 3 │ a │
# │ 8 │ 3 │ b │
# │ 9 │ 3 │ c │
2.3 复杂的关联方式