R|数据处理|merge数据详解

本文详细探讨了R语言中数据处理的merge操作,包括dplyr包的join函数和data.table包的合并方法。通过实例展示了如何处理合并过程中遇到的不同列名、重复列等问题,以及静态表和动态表的合并策略。内容涵盖left_join、right_join、inner_join、full_join、semi_join和anti_join等,并对比了data.table中的[DT, ]和merge函数的使用。" 79809898,5642702,深入理解React元素渲染,"['React', 'JSX', '渲染']
640?wx_fmt=gif 作者简介

Dwzb , R语言中文社区专栏作者,厦门大学统计专业学生。

知乎专栏:https://zhuanlan.zhihu.com/Data-AnalysisR 

前文推送

  R数据处理|基础篇(一)

  R数据处理|基础篇(二)

  R数据处理|data.table篇(一)

R数据处理|data.table篇(二)

R数据处理|data.table篇(三)

R深入 | 数据类型

R | 基础绘图

R|ggplot2(一)|一个完整的绘图流程


由于merge数据在现实应用中使用非常广泛,而且真实的数据远远没有我们练习时使用的数据那么干净,所以有了这篇文章。本文会针对现实数据中可能遇到的一些问题,更深入地讲解merge数据的使用。

数据:自己有针对性地创建,故意踩一些坑并解决

函数:包括dplyr包的join族函数,data.table包的[DT, ]方法,基础及data.table包的merge函数

主要解决如下问题

  • 要合并的两个数据集,合并所依据的列,名称不同

  • 要合并的两个数据集,有一些相同的列名,合并后需要更改防止两列同名

  • 合并所依据的列不是完全相同的,展示多种取舍方法

  • 合并所依据的列中,内容不是唯一的,展示几种情况的处理方法

全文分dplyr包和data.table包来讲

数据创建

先简单说明一下创建的数据

第一组一共四个数据框

  • data_map 有两列可以用于merge,作为其他数据之间的桥梁,将所有数据merge在一起

  • data_good 用于merge的列形式很好,和data_map中的列一一对应,用于展示最简单的数据框merge合并。但是为了演示一些参数,在列名上挖了两个坑

  • data_diff 用于merge的列和data_map中的列有交集,都不完全包括对方,用于展示多种取舍方法在两个包中的 实现

  • data_bad 用于merge的列有重复,与data_map这个没有重复的数据来merge

第二组两个数据框: bad1和bad2,用于merge的列都有重复,用于展示都有重复时的merge

这里主要展示数据框创建代码,数据框长什么样子,在下面的例子中都会展示

 
 

library(dplyr) library(data.table) library(lubridate) # 设置随机种子保证随机试验可以重复 set.seed(1234) # 两列每个值都是唯一的 data_map <- data.table(name_id = letters[1:10], card_id = LETTERS[1:10]) m2 <- sample(letters[1:10], 15, replace = T) m1 <- sample(LETTERS[1:10], 10, replace = F) # object_id列值是唯一的,且正好和data_map的name_id列一一对应 data_good <- data.table(object_id = m1, # 与card_id列对应来合并,故意制造合并列名称不同的情况                    name_id = paste(m1, m1, sep='')) # 故意制造同名情况 # name_id列值唯一,与data_map的name_id只有4个重合的 data_diff <- data.table(name_id = sample(letters, 10, replace = F),                        x1 = c(rep('m',4), rep('n',3), rep('p',3))) # name_id列值不唯一,与data_map的name_id只有7个重合的,但是data_bad中有的在data_map中都能找到 data_bad <- data.table(name_id = m2, # 与name_id对应来合并            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值