专栏首页数据驱动实践R语言 数据(集)合并与连接/匹配 | 专题2

R语言 数据(集)合并与连接/匹配 | 专题2

数据(集)处理是数据分析过程中的重要环节,今天特别整理数据(集)合并、增减与连接的相关内容,并逐一作出示例。

目 录

1 数据合并

1.1 cbind列合并(等长)

1.2 rbind行合并

2 数据连接/匹配

2.1 内连接

2.2 外连接

2.3 左连接

2.4 右连接

2.5 双(多)字段内连接

3 数据增减

正 文

1 数据合并

1.1 cbind列合并(等长)

总结:cbind等行数、按列合并(无序)

#等长
#生成测试数据
> ID1 <- c(1:4)
> ID2 <- c(2:5)
> name<-c("A","B","C","D")
> score<-c(8,22,7,6)
> student1<-data.frame(ID1,name)
> student2<-data.frame(ID2,score)

> student1
  ID1 name
1   1    A
2   2    B
3   3    C
4   4    D
> student2
  ID2 score
1   2     8
2   3    22
3   4     7
4   5     6
> cbind(student1,student2) #按照行合并student1和student2
  ID1 name ID2 score
1   1    A   2     8
2   2    B   3    22
3   3    C   4     7
4   4    D   5     6

1.2 rbind行合并

总结:按行合并,需要注意数据集需要有相同的列字段名

> #生成测试数据student1
> ID <- c(1:4)
> score <- c(8,22,7,33)
> student1<-data.frame(ID,score)
> #生成测试数据student2
> ID <- c("A","B","C","D")
> score <- c(11,2,55,3)
> student2<-data.frame(ID,score)

> student1
  ID score
1  1     8
2  2    22
3  3     7
4  4    33
> student2
  ID score
1  A    11
2  B     2
3  C    55
4  D     3
> rbind(student1,student2) #按行合并,需要注意数据集需要有相同的列字段名
  ID score
1  1     8
2  2    22
3  3     7
4  4    33
5  A    11
6  B     2
7  C    55
8  D     3

2 数据连接/匹配

数据连接主要涉及到merge函数和dplyr包中的*_join等函数,另外sqldf函数(SQL)亦可以实现数据连接功能。本节主要就merge和dplyr::*_join函数做出解释。

merge函数语法

merge(x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
      incomparables = NULL, ...)

其中,通过by字段控制连接字段by = "ID"为单字段连接,by = c("ID","NAME",……)为多字段连接;通过all=FALSE/TRUE、all.x = TRUE和all.y = TRUE实现内连接、外连接、左连接和右连接

dplyr包中的inner_join、left_join、right_join、full_join语法

inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
  ...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
  ...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

其中,通过by控制连接字段通过dplyr::*_join中的“*”控制连接形式。

> #生成数据集1
> ID<-c(1,2,3)
> name<-c("Jim","Tony","Lisa")
> student1<-data.frame(ID,name)
> #生成数据集1
> ID<-c(1,2,5)
> score<-c(89,22,78)
> student2<-data.frame(ID,score)
> student1
  ID name
1  1  Jim
2  2 Tony
3  3 Lisa
> student2
  ID score
1  1    89
2  2    22
3  5    78

2.1 内连接(指定字段匹配输出)

总结:merge(……,all=FALSE)等价dplyr::inner_join(……)

> #内连接
> merge(student1,student2,by="ID",all=FALSE)
  ID name score
1  1  Jim    89
2  2 Tony    22
> dplyr::inner_join(student1,student2,by="ID")
  ID name score
1  1  Jim    89
2  2 Tony    22

2.2 外连接

总结:merge(……,all=TRUE)等价dplyr::full_join(……)所有数据均加入,如无法连接则生成NA

> #外连接
> merge(student1,student2,by="ID",all=TRUE)
  ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA
4  5 <NA>    78
> dplyr::full_join(student1,student2,by="ID")
  ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA
4  5 <NA>    78

2.3 左连接

总结:merge(……,all.x=TRUE)等价dplyr::left_join(……)所有左侧(x)数据均加入,即使无法连接亦保留

> #左连接
> merge(student1,student2,by="ID",all.x=TRUE)
  ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA
> dplyr::left_join(student1,student2,by="ID")
  ID name score
1  1  Jim    89
2  2 Tony    22
3  3 Lisa    NA

2.4 右连接

总结:merge(……,all.y=TRUE)等价dplyr::right_join(……)所有右侧(y)数据均加入,即使无法连接亦保留

> #右连接
> merge(student1,student2,by="ID",all.y=TRUE)
  ID name score
1  1  Jim    89
2  2 Tony    22
3  5 <NA>    78
> dplyr::right_join(student1,student2,by="ID")
  ID name score
1  1  Jim    89
2  2 Tony    22
3  5 <NA>    78

2.5 双(多)字段内连接

> #生成数据集1
> ID<-c(1,2,3)
> SD <- c(1,2,3)
> name<-c("Jim","Tony","Lisa")
> student1<-data.frame(ID,SD,name)
> #生成数据集1
> ID<-c(1,2,5)
> SD <- c(5,2,3)
> score<-c(89,22,78)
> student2<-data.frame(ID,SD,score)
> student1
  ID SD name
1  1  1  Jim
2  2  2 Tony
3  3  3 Lisa
> student2
  ID SD score
1  1  5    89
2  2  2    22
3  5  3    78
> 
> #多字段内连接
> merge(student1,student2,by=c("ID","SD"),all=FALSE)
  ID SD name score
1  2  2 Tony    22
> dplyr::inner_join(student1,student2,by=c("ID","SD"))
  ID SD name score
1  2  2 Tony    22

3 数据增减

常见如以下不同方法

#方法一:减行数或列数
x=x[,-1] #代表删除x数据集中第一列数据

#方法二:dplyr::mutate
#数值重定义和赋值
#将Ozone列取负数赋值给new,然后Temp列重新计算为(Temp - 32) / 1.8
mutate(airquality, new = -Ozone, Temp = (Temp - 32) / 1.8)

#方法三:subset筛选变量服从某值的子集
subset(airquality, Temp > 80, select = c(Ozone, Temp))

#方法四:rbind和cbind

本文分享自微信公众号 - 数据驱动实践(Data-driven),作者:拴小林

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言 分组计算,不止group_by

    最近在研究excel透视图,想到好像自己在R-分组操作并不是很流畅,顺便学习分享一下。R自带数据集比较多,今天就选择一个我想对了解的mtcars数据集带大家学习...

    拴小林
  • R语言 基本统计分析

    “ 本章节是数据预处理的第一步:了解数据(集)。只有充分了解了数据,我们才能对数据做进一步的预处理和后续深入的分析。”

    拴小林
  • R语言 交互式绘图echarts4r包初探

    “ echarts4r 包是R 语言访问/调用百度ECharts的接口,语法结构简单,可读性强,是很好的交互式绘图包。”

    拴小林
  • 不用SQL,也可以实现数据集的合并和连接

    数据(集)处理是数据分析过程中的重要环节,今天特别整理数据(集)合并、增减与连接的相关内容,并逐一作出示例。

    1480
  • 打分排序系统漫谈1 - 时间衰减

    打分排序系统的应用非常普遍,比如电影的评分,知乎帖子的热度,和新闻文章的排序。让我们从最简单直观的平均打分开始, 聊聊各种打分方法的利弊和使用场景。

    风雨中的小七
  • SQL 求平均值时去掉极值

    在一些比赛中,为了公平起见,算法端会在评委给出的分数里面去掉一个最高分和一个最低分,再求平均分,平均分即是选手的最后得分。

    白日梦想家
  • MySQL 从零开始:07 数据搜索与搜索

    数据库表中包含了很多数据,一般我们不会检索表中的所有行。通常会根据特定的条件来提取出表的子集,此时我们需要指定搜索条件(search criteria),搜索条...

    王强
  • Oracle mybatis 新增返回主键ID

    <selectKey resultType="String" order="BEFORE" keyProperty="enterp_no"> ...

    斯文的程序
  • R语言中dcast 和 melt的使用

    邓飞
  • [783]python使用PythonMagick将jpg图片转换成png图片

    PythonMagick库无法用pip或者easy_install来安装,因此,需要手动安装,地址如下: https://www.lfd.uci.edu/~g...

    周小董

扫码关注云+社区

领取腾讯云代金券