个性化阅读
专注于IT技术分析

在R中合并数据集

本文概述

在应用的设置中, 数据托管在不同的服务器上, 并且存在于许多不同的文件中。当你需要的数据来自多个来源时, 至关重要的是要知道如何汇总它们, 以使你丢失尽可能少的信息, 并根据数据的结构进行有意义的配对。

本教程将指导你完成以下操作:

  • 水平和垂直合并数据集
  • 什么是主键, 以及它们如何为你的数据添加结构
  • 不同类型的联接(例如, 左联接, 内部联接, 完全联接)以及如何在其中进行选择
  • 需要注意的常见问题以及解决方法

连接数据集

在较高的层次上, 有两种合并数据集的方法:你可以通过添加更多行或在数据集中添加更多列来添加信息。通常, 当数据集具有相同的列集或具有相同的观察值时, 可以分别将它们垂直或水平连接。让我们通过看一些例子来学习。

垂直添加数据集

当多个数据集具有相同的列集时, 可以将一个数据集垂直连接到另一个。也就是说, 保留数据集的列, 可以向其中添加更多行。将此类信息保存在一个文件中将使你更轻松地进行汇总和查看大图, 而无需在多个文件之间来回切换并避免跟踪。

数据集1

使 当然模型
本田 63
宝马 10

数据集2

使 当然模型
福特汽车 26
特斯拉 4

重要的是要注意, 如果你对多个数据集具有相同的观察结果, 并且使用rbind()将它们垂直连接在一起, 那么最终将在表中得到重复的观察结果。尽管两个数据集必须具有相同的变量集(即列), 但它们不必具有相同的顺序。在下面的控制台中查看!

在你的工作区中, 有两个数据集, 分别在上面看到。尝试对数据集1的列重新排序。在数据集1和数据集2以及reordered_dataset1和数据集2上调用rbind()。

在rbind()之后, 你的结果应该在一张表中包含所有四种汽车制造商的信息, 如下所示:

垂直串联数据集

使 当然模型
本田 63
宝马 10
福特汽车 26
特斯拉 4

水平添加数据集

当你拥有代表同一组观测值的数据集时, 可以将这些数据集水平合并。这次, 保留数据集的行, 可以向其中添加更多列。在这种情况下, 你应该检查观察顺序是否相同。如果数据集的行数不同, 或者它们的行数相同, 但是行的顺序不一致, 则可以用一种没有意义的方式将一组列与另一组列配对。

让我们将上面的示例扩展为一个示例。假设你有两个数据文件, 一个包含汽车制造商和所提供的独特型号的数量, 另一个包含汽车制造商和总销售额的数据文件:

提供的独特型号数量

使 当然模型
本田 63
宝马 10
福特汽车 26
特斯拉 4

总销售额

使 营业额
福特汽车 119157
宝马 25908
本田 188328
特斯拉 29975

重要的是要注意, 如果你对多个数据集具有相同的观察结果, 并且使用cbind()将它们水平连接, 则最终将在表中出现多余的列。尽管两个数据集包含相关信息, 但行的顺序很重要!

在下面的控制台中, 在模型和销售上调用cbind()并打印出结果:

你应该已经得到了这样的东西:

型号与销售

使 当然模型 使 营业额
本田 63 福特汽车 119157
宝马 10 宝马 25908
福特汽车 26 本田 188328
特斯拉 4 特斯拉 29975

你在这里看到问题了吗?此数据不整洁!

根据本基础课程中讲授的整洁数据原理, 对数据集的每次观察都应在唯一的一行中表示。而且, 如果你仅在一个数据集中的某些行上具有信息, 并且仅想为那些你拥有更多信息的信息添加信息, 那该怎么办?换句话说, 如果你想将一个数据集中的更多列添加到另一个数据集中, 但是这些数据集没有相同数量的观测值, 该怎么办?

主键和外键

寻求合并数据集的第一步是寻找数据集的主键。主键是唯一标识数据集中每个观察值的列或列集。在有关汽车制造商, 提供的独特模型的数量以及总销售额的示例中, 数据集的主键是制造商列。

现在, 我们可以执行联接, 这是将数据集合并到单个表中的标准方法。

联接类型

联接的类型很多。你可以在dplyr的R的连接数据教程中, 学习如何使用变异联接将一个数据集中的列扩充为另一个列, 如何通过过滤联接将一个数据集与另一个数据集进行筛选, 以及如何使用set操作筛选数据集。以下是一些最常见的内容。

left_join(x, y):从x返回所有行, 从x和y返回所有列。 x中的行与y中的不匹配项将在新列中具有NA值。如果x和y之间存在多个匹配项, 则返回所有匹配项组合。

inner_join(x, y):返回y中有匹配值的x中的所有行, 以及x和y中的所有列。如果x和y之间存在多个匹配项, 则返回所有匹配项组合。

full_join(x, y):返回x和y的所有行和所有列。如果没有匹配的值, 该函数将为缺少的值返回NA。

上面提到的联接是变异联接的示例, 因为它们组合了来自两个数据集的变量。

缺少键

假设你有两个数据集。第一个数据集称为大小, 其中包含人物名称及其衬衫尺寸:

> size
name size
1  Tom    M
2  Dan   XL
3 Keil    S

第二个数据集称为颜色, 其中包含人们的姓氏, 衬衫的颜色首选项, 并将一些信息存储在row.names属性中:

> color
     surname color
Tom     Jeon  <NA>
Dan    Smith  Dark
Bob McLadden Light

注意这里可能出什么问题吗?当缺少键或重复键时, 两表联接可能会变得很复杂。在此示例中, R的数据帧将重要信息存储在row.names属性中。在这种情况下, 你将无法使用连接功能访问密钥, 因为连接功能只能访问数据框的列。

轻松解决此问题的技巧是使用tibble包中的rownames_to_column()函数。它返回数据集的副本, 其中行名作为列添加到数据中。 rownames_to_column()的第一个参数是你的数据框架对象, 第二个参数是一个字符串, 用于指定要添加的列的名称。

尝试在下面的控制台中浏览。数据集的大小和颜色已预加载到你的工作空间中。

最后的想法

在现实世界中, 数据可能会分散在许多数据集之间, 并跨越许多不同的格式。由于R被设计为使用单个数据表, 因此将数据集处理并将其组合到单个表中是一项必不可少的技能。完成具有R技能跟踪的”导入和清除数据”, 并学习解析和组合任何格式的数据。学习愉快!

赞(0)
未经允许不得转载:srcmini » 在R中合并数据集

评论 抢沙发

评论前必须登录!