下面内容摘录自:
4章7节:用R做数据重塑,数据去重和数据的匹配-CSDN博客文章浏览阅读23次。数据重塑是数据分析和数据清洗中的重要步骤,其中包括数据去重和数据匹配。理解这两个概念以及它们的实现方法对于有效处理和分析数据至关重要。https://blog.csdn.net/2301_79425796/article/details/141111121欢迎订阅我们专栏
二、数据重塑之数据去重
数据去重(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、完全去重
在上面数据集中,如果一条患者记录的所有字段(如 PatientID
、Name
、Age
、Diagnosis
、Address
和 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
组合的首次出现的记录,其他重复项已被删除。
运行上述代码,我们可以识别出哪些行是基于Patient
和Age
字段的重复记录,并将这些重复记录删除,得到最终的数据集。
# 显示按 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)。我们将以构建两个示例数据框为基础,逐步演示这些操作的实现和实际应用场景。
.........
欢迎订阅我们专栏,深度系统地学习R语言。
为帮助大家更出色地掌握临床统计、数据挖掘以及人工智能建模的入门知识和应用,由于众多同学在计算机编程上经验欠缺,特此开设《R 语言与数据科学的终极指南》专栏。该专栏每周至少会定期更新三篇,直到整个专栏更新完成。每篇文章都在 5000 字以上,质量平均分高达 94 分。要提醒大家的是,每结束一个章节,专栏的优惠力度就会减小,当下正是订阅的最佳优惠时段,诚邀各位积极订阅!
专栏《R 语言与数据科学的终极指南》链接:https://blog.csdn.net/2301_79425796/category_12729892.html?spm=1001.2014.3001.5482