数据合并-join函数

前面介绍了数据框合并的merge函数方法,其实还可以借助plyr和dplyr包中的join函数进行数据框的合并,它们数据框合并的原理同样是数据框的合并原理是这样的:首先在x表按指定列每一行的内容在y表的指定列都进行逐行匹配,直到x中所有行匹配完为止。

数据说明

这里的数据仍使用merge函数中的两个数据(略有修改):作者信息数据和书籍信息数据。依照下面介绍的合并条件,这两个数据既有相同的内容,又有彼此中不存在的内容。

  • 作者信息数据
authors <- data.frame(
	id =  c(2, 4, 2, 5, 7, 8, 3),
	surname = I(c("Tukey", "Venables", 'kx', "Tierney", "Ripley", "McNeil", "kuangxu")),
	nationality = c("US", "Australia", 'China', "US", "UK", "Australia", "China"),
	deceased = c("yes", rep("no", 6)))

为了区别数据,就把自己的名字也给安排进去了,唯一的一个中国人啊。

  • 书籍信息数据
books <- data.frame(
	id = c(1:7,2)
    name = I(c("Tukey", "Venables", "Tierney",
             "Ripley", "Ripley", "McNeil", "R Core", "kuang")),
    title = c("Exploratory Data Analysis",
              "Modern Applied Statistics ...",
              "LISP-STAT",
              "Spatial Statistics", "Stochastic Simulation",
              "Interactive Data Analysis",
              "An Introduction to R", "My R study"),
    other.author = c(NA, "Ripley", NA, NA, NA, NA,
                     "Venables & Smith", NA))

plyr包的join函数

join函数:

join(x, y, by = NULL, type = 'left', match = 'all')
  • x,y 为合并的数据框
  • by 为排序依据,默认值Null时按名字相同的量匹配,此时,要求必须有相同列名的列
  • type为合并方式
    • inner,行:显示x,y中共有的行; 列:显示x,y中的所有列
    • left,行:显示x中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA
    • right,行:显示y中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA
    • full,先显示x中所有的行在y中的匹配结果,接着显示y中未匹配上的内容
  • match匹配的规则
    • first,只匹配y中的第一个记录
    • match,匹配y中所有记录
join(authors, books)
join(authors, books, type = 'left', match = 'first')
join(authors, books, type = 'inner')
join(authors, books, type = 'right')
join(authors, books, type = 'full')

dplyr包的join函数

dplyr包是plyr包的升级,join函数在dplyr包中是个系列函数。 join函数:

join(x, y, by = NULL, copy = FALSE, ...)
  • x,y 为合并的数据框,不要求x,y中排序列唯一
  • by 为排序依据,默认值Null时按名字相同的量匹配,此时,要求必须有相同列名的列
  • join为系列函数,包括inner_join、left_join、semi_join和anti_join函数

dplyr包的join函数似乎没有plyr包的join函数的match参数,只能进行所谓的all匹配

inner_join函数

函数结果, 行:显示x中所有能在y中匹配到行; 列:显示x,y中的所有列

library(dplyr)
# 单指标匹配
inner_join(authors, books)
inner_join(authors, books, by = c('surname' = 'name'))
# 多指标匹配
inner_join(authors, books, by = c('id'='id','surname' = 'name'))

left_join函数

结果, 行:显示x中所有的行; 列:显示x,y中的所有列,未匹配到的值,不论字符数字,全显示为NA。

# 单指标匹配
left_join(authors, books)
left_join(authors, books, by = c('surname' = 'name'))
# 多指标匹配
left_join(authors, books, by = c('id'='id','surname' = 'name'))

semi_join函数

结果, 行:显示x中所有能在y匹配到行,并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。

# 单指标匹配
semi_join(authors, books)
semi_join(authors, books, by = c('surname' = 'name'))
# 多指标匹配
semi_join(authors, books, by = c('id'='id','surname' = 'name'))

anti_join函数

结果, 行:显示x中所有未能在y中匹配到行, 并对显示结果按匹配依据进行了排序; 列:显示x中的所有列。

# 单指标匹配
anti_join(authors, books)
anti_join(authors, books, by = c('surname' = 'name'))
# 多指标匹配
anti_join(authors, books, by = c('id'='id','surname' = 'name'))

full_join函数

结果, 行:显示x, y中所有的行, 未匹配到的值,不论字符数字,全显示为NA。

# 单指标匹配
full_join(authors, books)
full_join(authors, books, by = c('surname' = 'name'))
# 多指标匹配
full_join(authors, books, by = c('id'='id','surname' = 'name'))
Previous     Next Xu Kuang /
Published under (CC) BY-NC-SA in categories 技术篇  tagged with R  数据合并  plyr  dplyr