4章7节:用R做数据重塑,数据去重和数据的匹配

news2024/9/21 14:51:31

在数据科学的分析流程中,数据重塑是一项非常重要的操作。数据的重塑通常指将数据从一种形式转换为另一种形式,以满足后续分析的需求。R语言提供了丰富的工具和函数来帮助用户高效地进行数据重塑操作。本文中,我们将深入探讨数据重塑的概念及其重要性,并详细介绍几个关键操作,包括数据去重、数据的匹配以及行列命名。

一、数据重塑

数据重塑(Data Reshaping)是指通过对数据框(Data Frame)或其他类型的数据结构进行操作,改变其形式或结构的过程。数据重塑的目标是使数据更加符合特定分析的需求,从而简化分析过程,提高分析的准确性和效率。

提高数据分析的灵活性:通过重塑数据,分析人员可以将数据转换为适合各种分析模型的形式。例如,将宽格式数据转换为长格式数据,或反之亦然,以便于时间序列分析、回归分析等。

数据清理与准备:数据重塑是数据清理过程中不可或缺的一部分。通过重塑,用户可以去除冗余信息、修正错误数据、匹配数据集之间的关系等。

优化计算性能:在某些情况下,特定形式的数据可能更易于处理,能够提高计算效率,特别是在处理大数据集时。

简化可视化过程:很多可视化工具和方法对数据的格式有特定的要求,通过重塑数据,可以更轻松地将数据转换为适合可视化的格式。

二、数据重塑之数据去重

数据去重(Data deduplication)是指识别并删除数据文件集合中的重复数据,仅保留唯一的数据单元,从而消除冗余数据。因为重复数据的存在不但浪费存储资源,而且可能导致数据分析结果出现偏差,所以在数据清洗过程中,去重是不可忽视的一项工作。

数据去重通常有完全去重和不完全去重两种。

完全去重是指在数据集中识别并删除那些所有字段值完全相同的重复记录。比如,在一个客户数据库中,如果两个记录的所有字段(如姓名、地址、电话等)完全相同,则其中一个记录将被删除,保留唯一的一份记录。完全去重的主要目的是消除完全重复的数据,确保每一条记录都是唯一的。

不完全去重涉及到在数据清洗过程中处理那些部分重复的数据记录。与完全去重不同,不完全去重的标准是根据数据的业务逻辑和具体需求来确定的。比如,在一个客户数据库中,两个记录可能在部分字段上相同(如姓名相同但地址不同),这种情况下,我们需要根据实际业务需求来决定是否保留这些记录,以及如何处理这些部分重复的记录。

在医学数据处理中,由于数据的复杂性和多样性,去除重复数据显得尤为重要。为了演示去重操作,

我们先创建一个就医患者的数据集。这里我们将数据集中每一行表示一个患者的就诊记录,包括患者 ID、姓名、年龄、诊断、住址和就诊日期等信息。我们将探讨完全去重和不完全去重的应用场景,并演示如何使用 duplicated() 函数实现不完全去重。

# 创建扩展的示例患者数据集
patients_data <- data.frame(
 PatientID = c(1, 2, 3, 1, 4, 5, 6, 3, 7, 8, 9, 3, 10, 11),
 Name = c("张三", "李四", "王五", "张三", "赵六", "孙七", "周八", "王五", "吴九", "王五", "李四", "王五", "李四", "赵六"),
 Age = c(30, 45, 28, 30, 60, 50, 34, 28, 41, 28, 45, 29, 45, 60),
 Diagnosis = c("感冒", "高血压", "糖尿病", "感冒", "冠心病", "关节炎", "胃炎", "糖尿病", "肺炎", "胃炎", "高血压", "糖尿病", "感冒", "冠心病"),
 Address = c("北京", "上海", "广州", "北京", "天津", "深圳", "南京", "广州", "杭州", "南京", "上海", "上海", "北京", "天津"),
 VisitDate = as.Date(c('2024-01-01', '2024-01-02', '2024-01-03', '2024-01-01', '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-03', '2024-01-07', 
                       '2024-01-06', '2024-01-02', '2024-01-03', '2024-01-01', '2024-01-04'))
)

# 显示扩展后的原始患者数据集
print("扩展后的原始患者数据集:")
print(patients_data)

数据可见:

   PatientID Name Age Diagnosis Address  VisitDate
1          1 张三  30      感冒    北京 2024-01-01
2          2 李四  45    高血压    上海 2024-01-02
3          3 王五  28    糖尿病    广州 2024-01-03
4          1 张三  30      感冒    北京 2024-01-01
5          4 赵六  60    冠心病    天津 2024-01-04
6          5 孙七  50    关节炎    深圳 2024-01-05
7          6 周八  34      胃炎    南京 2024-01-06
8          3 王五  28    糖尿病    广州 2024-01-03
9          7 吴九  41      肺炎    杭州 2024-01-07
10         8 王五  28      胃炎    南京 2024-01-06
11         9 李四  45    高血压    上海 2024-01-02
12         3 王五  29    糖尿病    上海 2024-01-03
13        10 李四  45      感冒    北京 2024-01-01
14        11 赵六  60    冠心病    天津 2024-01-04

1、完全去重

在上面数据集中,如果一条患者记录的所有字段(如 PatientIDNameAgeDiagnosisAddress 和 VisitDate)都与另一条记录相同,则认为它是完全重复的,需要删除。我们可以使用R中的unique()函数删除完全重复的行,只保留一个记录:

# 使用 unique() 函数进行完全去重
unique_patients <- unique(patients_data)

# 显示完全去重后的患者数据集
print("完全去重后的患者数据集:")
print(unique_patients)

去重后的数据集为:

   PatientID Name Age Diagnosis Address  VisitDate
1          1 张三  30      感冒    北京 2024-01-01
2          2 李四  45    高血压    上海 2024-01-02
3          3 王五  28    糖尿病    广州 2024-01-03
5          4 赵六  60    冠心病    天津 2024-01-04
6          5 孙七  50    关节炎    深圳 2024-01-05
7          6 周八  34      胃炎    南京 2024-01-06
9          7 吴九  41      肺炎    杭州 2024-01-07
10         8 王五  28      胃炎    南京 2024-01-06
11         9 李四  45    高血压    上海 2024-01-02
12         3 王五  29    糖尿病    上海 2024-01-03
13        10 李四  45      感冒    北京 2024-01-01
14        11 赵六  60    冠心病    天津 2024-01-04

可以看到,去重后数据集中的重复记录已被成功移除。

2、不完全去重

除了使用unique()函数进行完全去重外,在实际的数据清洗工作中,还可能遇到需要基于部分字段进行去重的需求。R中的duplicated()函数可以帮助我们识别部分字段的重复记录,然后根据这些重复记录进行去重操作。

接上面的例子,我们可以根据实际业务逻辑来决定如何处理这些有部分重复的记录。所以,我们将基于 VisitDate 和 Address 进行去重,保留记录中患者的首次出现。

# 基于 VisitDate 和 Address 进行去重,保留首次记录
non_dup_patients <- patients_data[!duplicated(patients_data[, c("VisitDate", "Address")]), ]

上面这行代码的目的是对患者数据集进行不完全去重,具体来说:提取 VisitDate 和 Address 列: 选择这两个列作为去重的基础,意思是我们希望找到在同一天、同一地点就诊的重复记录。检测重复: 使用 duplicated() 函数检测 VisitDate 和 Address 组合中的重复记录。保留首次记录: 通过 !duplicated() 的逻辑反转操作,仅保留每组 VisitDate 和 Address 组合中的第一条记录,其余重复记录将被去掉。创建去重后的数据框: 最终,去重后的数据框被赋值给 non_dup_patients,该数据框中只包含每个 VisitDate 和 Address 组合的首次出现的记录,其他重复项已被删除。

运行上述代码,我们可以识别出哪些行是基于PatientAge字段的重复记录,并将这些重复记录删除,得到最终的数据集。

# 显示按 VisitDate 和 Address 去重后的患者数据集(保留首次记录)
print("按 VisitDate 和 Address 去重后的患者数据集(保留首次记录):")
print(non_dup_patients)

结果可见:

   PatientID Name Age Diagnosis Address  VisitDate
1          1 张三  30      感冒    北京 2024-01-01
2          2 李四  45    高血压    上海 2024-01-02
3          3 王五  28    糖尿病    广州 2024-01-03
5          4 赵六  60    冠心病    天津 2024-01-04
6          5 孙七  50    关节炎    深圳 2024-01-05
7          6 周八  34      胃炎    南京 2024-01-06
9          7 吴九  41      肺炎    杭州 2024-01-07
12         3 王五  29    糖尿病    上海 2024-01-03

2、数据的匹配

数据匹配(Data Matching)是指基于某个或某些相同的变量(字段),将两个数据框合并在一起。数据匹配操作在数据预处理和整合中非常常见,尤其在处理来自不同数据源的医学数据时更是如此。常见的匹配操作包括左连接(left join)、右连接(right join)、内连接(inner join)、全连接(full join)、半连接(semi join)和反连接(anti join)。我们将以构建两个示例数据框为基础,逐步演示这些操作的实现和实际应用场景。

构建两个示例数据框

首先,我们构建两个示例数据框df.1df.2,用于演示不同类型的数据匹配与合并操作。

# 创建两个数据框
df.1 <- data.frame(x = c('a','b','c','d','e','f','a'), y = c(1, 2, 3, 4, 5, 6, 7))
df.2 <- data.frame(x = c('a','b','m','n'), z = c('A','B','M',"N"))

# 查看数据框内容
print(df.1)
print(df.2)

df.1的数据如下:

  x y
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6
7 a 7

df.2的数据如下:

  x z
1 a A
2 b B
3 m M
4 n N

左连接(Left Join)

左连接返回左表df.1的所有记录,并且会匹配右表df.2中相同x值的记录。如果在右表中没有匹配的记录,结果中对应的列值为NA

library(dplyr)

# 执行左连接
result_left_join <- left_join(df.1, df.2, by = 'x')
print(result_left_join)

结果可见:

  x y    z
1 a 1    A
2 b 2    B
3 c 3 <NA>
4 d 4 <NA>
5 e 5 <NA>
6 f 6 <NA>
7 a 7    A

左连接在数据整合过程中非常有用,尤其当你需要保持主要数据框的所有记录,而仅在某些列上增加补充信息时。

右连接(Right Join)

右连接与左连接相反,它返回右表df.2的所有记录,并匹配左表df.1中的记录。如果左表中没有匹配的记录,结果中对应的列值为NA

# 执行右连接
result_right_join <- right_join(df.1, df.2, by = 'x')
print(result_right_join)

结果可见:

  x  y z
1 a  1 A
2 b  2 B
3 a  7 A
4 m NA M
5 n NA N

右连接主要用于保留右表的所有记录,并在需要时填充来自左表的相关数据。

内连接(Inner Join)

内连接返回两个数据框中匹配的部分,也就是变量x的交集部分。仅保留在两个数据框中都存在的记录。

# 执行内连接
result_inner_join <- inner_join(df.1, df.2, by = 'x')
print(result_inner_join)

结果可见:

  x y z
1 a 1 A
2 b 2 B
3 a 7 A

内连接最适合在你只关心同时存在于两个数据集中的记录时使用。

全连接(Full Join)

全连接将两个数据框的所有记录返回。如果某个数据框中没有匹配的记录,结果中对应的列值为NA

# 执行全连接
result_full_join <- full_join(df.1, df.2, by = 'x')
print(result_full_join)

结果可见:

  x  y    z
1 a  1    A
2 b  2    B
3 c  3 <NA>
4 d  4 <NA>
5 e  5 <NA>
6 f  6 <NA>
7 a  7    A
8 m NA    M
9 n NA    N

全连接在需要结合所有可能的记录时非常有用,特别是在数据整合和对比分析中。

半连接(Semi Join)

半连接用于从左表(df.1)中提取在右表(df.2)中有匹配项的记录。换句话说,半连接会返回左表中所有能够在右表中找到匹配值的行,但它只保留左表中的列,而不会添加右表中的列。

# 执行半连接
result_semi_join <- semi_join(df.1, df.2, by = 'x')
print(result_semi_join)

结果可见:

  x y
1 a 1
2 b 2
3 a 7
在这个例子中, df.1中的 x列有值 ab,它们在 df.2中也存在。因此,半连接返回了 df.1xab的所有记录。

反连接(Anti Join)

反连接用于从左表(df.1)中排除在右表(df.2)中有匹配项的记录。简单来说,反连接会返回左表中所有在右表中找不到匹配值的行。

# 执行反连接
result_anti_join <- anti_join(df.1, df.2, by = 'x')
print(result_anti_join)

结果可见:

  x y
1 c 3
2 d 4
3 e 5
4 f 6

 半连接和反连接在数据处理的特定场景中非常有用,前者用于提取符合条件的记录,而后者用于排除不符合条件的记录。它们可以帮助我们有效地筛选和清理数据,从而提高数据分析的精度和效率。

更新:2024/08/11 

d96608fa45f848ab9ecd4a1f242a6375.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

假如你正在备考六西格玛黑带,请看我的推文

众所周知&#xff0c;红宝书是备考六西格玛黑带的经典教材之一。那么&#xff0c;如何用红宝书高效备考六西格玛黑带呢&#xff1f;天行健六西格玛培训讲师总结如下&#xff1a; 1. 熟悉六西格玛概念&#xff1a;首先&#xff0c;你需要对六西格玛的基本概念有一个清晰的了解。…

智启万象|挖掘广告变现潜力,保障支付安全便捷

谷歌致力于为开发者提供 先进的广告变现与支付解决方案 一起回顾 2024 Google 开发者大会 了解如何利用谷歌最新工具和功能 提高变现收入&#xff0c;优化用户体验&#xff0c;保障交易安全 让变现更上一层楼 广告检查器是谷歌 AdMob 平台最新推出的高级测试工具&#xff0c;开…

mitmproxy 安装配置

下载地址&#xff1a; mitmproxy - an interactive HTTPS proxy 安装好之后&#xff0c;配置环境变量 我的电脑--右键---属性-----高级系统设置----环境变量-----path----编辑---将安装目录地址复制过来&#xff08;到 bin &#xff09; 查看版本&#xff1a;cmd----- mitmd…

【C++】——初识模板

目录 一、泛型编程 二、函数模板 2.1 定义 2.2 格式 2.3 生成原理 2.4 实例化 2.4.1 隐式实例化 2.4.2 显式实例化 2.5 匹配原则 三、类模板 3.1 定义格式 3.2 实例化 一、泛型编程 什么是泛型编程&#xff0c;大家可思考这个问题&#xff1a;swap函数大家都会实现&#x…

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)

上一篇博文&#xff1a;绘制条形码的效果不是很好&#xff1a;利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境&#xff1a; win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下&#xff1a; 1 新建.net framework 4.8的控制台项目…

正确利用AI工具,你的facebook广告效果将翻倍

如今投放facebook广告&#xff0c;你面临的对手已经不再是广告投手&#xff0c;而是AI&#xff0c;如果你的广告效果一直无法提升&#xff0c;不妨试着借助一下AI的力量&#xff0c;今天这篇文章就教你怎样才能让AI发挥它的最大价值&#xff0c;帮助我们的facebook广告效果提升…

STM32驱动SG90舵机完成控制

一、前言 SG90舵机的工作原理主要是基于PWM&#xff08;脉冲宽度调制&#xff09;信号来控制。 SG90舵机内部有一个基准电压&#xff0c;微处理器产生的PWM信号通过信号线进入舵机&#xff0c;产生直流偏置电压&#xff0c;与舵机内部的基准电压做比较获得电压差输出。电压差的…

精品在线试题库系统

TOC springboot108精品在线试题库系统 绪论** 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时…

Carry你飞驰:VELO Prevail TT坐垫,不是超人,也能飞!

确认过黑丝腿&#xff0c;是很爱骑的人&#xff01;以前脚踩二八大杠&#xff0c;就能赚足出街回头率&#xff0c;现在的打工牛马是坚持早c晚c&#xff0c;晨骑夜骑解压续命。夏日的阳光炙烤着大地&#xff0c;空气中弥漫着滚滚热浪&#xff0c;对于每一位热爱骑行的骑士来说&a…

WindowsAPI 查阅笔记:网络通信

客户端&#xff1a; 记得在编译的时候加上这个 -lwsock32 -lws2_32。 不然会报错 undefined reference to __imp_WSAStartup‘。 注意&#xff1a;如果端口在此之前被占了&#xff0c;则不会发生预期的结果 服务端&#xff0c;得到连接后创建线程&#xff0c;执行处理函数。…

你真的了解电子标签的潜力吗?3秒快刷颠覆你的想象

随着ESL电子标签在零售领域的大范围应用&#xff0c;其方便快捷更改显示内容的功能也逐渐拓展到仓储显示领域。但是仓储作业过程中货品出入库频繁&#xff0c;常规电子标签在实际使用过程中存在刷新速度偏长&#xff0c;无法充分满足仓储出入库数据更新的需求。因此&#xff0c…

阿里云智能大数据演进

本文根据7月24日飞天发布时刻产品发布会、7月5日DataFunCon2024北京站&#xff1a;大数据大模型.双核时代实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;徐晟 阿里云研究员/计算平台产品负责人 主要内容&#xff1a; Overview - 阿里云大数据 AI 产品…

秋招突击——面经整理——有塔游戏提前批

文章目录 引言正文一面说一下堆排序 二面有了解过游戏后端应该是干什么的吗&#xff1f;博客是从什么时候开始写的&#xff1f;平常在哪里做题&#xff1f;做了多少题&#xff1f;给你二维矩阵&#xff0c;零代表可以走&#xff0c;一代表不可以走&#xff0c;从起点到终点&…

Java:文件IO

JavaEE16 一、文件系统操作 在java标准库中&#xff0c;实现了File类&#xff0c;其中提供了文件操作的方法&#xff01; 1、构造方法&#xff1a; 方法名说明 File(File parent , String child) 根据父目录孩子文件路径&#xff0c;创建一个新的File 实例File( String path…

dockers 阿里云镜像失效后如何配置,可视化操作

Windows 环境 Client:Version: 24.0.6Context: defaultDebug Mode: false方法一 docker-desktop 配置方式 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,…

【echarts】甘特图

const milestones [{ progress: 100, milestoneName: 阶段一, startDate: 2020-12-23, endDate: 2021-01-30 },{ progress: 100, milestoneName: 阶段二, startDate: 2021-01-15, endDate: 2021-03-15 },{ progress: 100, milestoneName: 阶段三, startDate: 2021-03-10, endD…

ubuntu 24.04执行apt-get update报错处理

文章目录 一、apt-get update报错内容二、解决启动失败的服务推荐阅读 今天在做Ubuntu 24.04更新时&#xff0c;突然跳出两个报错&#xff0c;这在之前还从未遇到过&#xff0c;处理过程记录和分享一下&#xff1a; 一、apt-get update报错内容 报错截图参考如下&#xff1a; …

现货黄金美盘开盘时间是什么呢

现货黄金的开盘时间会因为地区和平台而有所差异&#xff0c;一般来说&#xff0c;香港的平台在北京时间周一早间7点左右会开盘&#xff0c;并一直持续周六凌晨才收盘&#xff0c;周六和周日是市场的休市时间&#xff0c;期间交易平台一般会关闭&#xff0c;无法进行交易&#x…

一文读懂什么是进销存!进销存有何价值作用?

企业在运营过程中&#xff0c;常常会遇到诸如库存不准确、采购计划混乱、销售数据跟踪困难等问题&#xff0c;这些问题不仅影响了企业的日常运营&#xff0c;还可能导致客户满意度下降、利润受损。而一个合适的进销存系统&#xff0c;就像是一把钥匙&#xff0c;可以帮助企业打…

MySQL基础练习题34-游戏玩法分析4

目录 题目 准备数据 分析数据 总结 题目 报告在首次登录的第二天再次登录的玩家的 比率&#xff0c;四舍五入到小数点后两位。换句话说&#xff0c;你需要计算从首次登录日期开始至少连续两天登录的玩家的数量&#xff0c;然后除以玩家总数。 准备数据 ## 创建库 create…