商务网站开发的工作任务,2023年商标注册流程图,做网站 宁波,重庆实时新闻最新消息在数据科学的分析流程中#xff0c;数据重塑是一项非常重要的操作。数据的重塑通常指将数据从一种形式转换为另一种形式#xff0c;以满足后续分析的需求。R语言提供了丰富的工具和函数来帮助用户高效地进行数据重塑操作。本文中#xff0c;我们将深入探讨数据重塑的概念及其… 在数据科学的分析流程中数据重塑是一项非常重要的操作。数据的重塑通常指将数据从一种形式转换为另一种形式以满足后续分析的需求。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、完全去重
在上面数据集中如果一条患者记录的所有字段如 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。我们将以构建两个示例数据框为基础逐步演示这些操作的实现和实际应用场景。
构建两个示例数据框
首先我们构建两个示例数据框df.1和df.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列有值 a和 b它们在 df.2中也存在。因此半连接返回了 df.1中 x为 a和 b的所有记录。 反连接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