【问题标题】:Data wrangling: How to merge two wide format datasets into one数据整理:如何将两个宽格式数据集合并为一个
【发布时间】:2020-07-17 02:49:39
【问题描述】:

我有两个宽格式数据集。两者共享一个公共索引列,我想将这两个数据集组合成一个基于这个公共列的宽格式数据集。下面提供了数据集的示例。

设数据集 A 为:

其中第 1 列是文档列表,宽列是在这些文档中找到的主题(如果文档提到主题,则为 1,否则为 0)

让数据集 B 为:



其中第 1 列与数据集 A 中的列表相同,其他列是国家/地区。值是该文档对该特定国家/地区的“重要程度”的自定义代码(例如,5 非常重要,1 不重要,0 表示不参与文档)。

我想将两者组合成一个单一的宽数据集,其中行是国家,列是主题。单元格内的值将等于一个国家通过文档处理某个主题的情况总和,由数据集 B 上的“重要性”编码加权。

完成的数据集如下所示:



例如,AFG 仅参与了文件 A/C.3/64/L.6,重要性为 5,由于该文件仅提及“获取信息”,AFG 对该主题的参与度为 5。反过来,参与在所有文件中,因此获得了与主题“绑架”(1*5=5)、“堕胎”(1*1=1)、“学历”(1*1 + 1*2=3)和“访问信息”(1*4=4)。

问题是完整的数据集 A 和 B 分别有超过 1k 个主题和 190 个国家。所以我需要找到一种自动化的方式来进行这种合并。对于如何在 Excel 或 R 上执行此操作的建议,我将不胜感激。

非常感谢

【问题讨论】:

  • 请使用dput添加数据,而不是图像。显示相同的预期输出。请阅读有关how to ask a good question 的信息以及如何提供reproducible example
  • 不清楚数据集 A 中的数据如何归属于国家。因此,我未能将您的结果公式“学术学位”(1*1 + 1*2=3) 与数据联系起来。

标签: r excel merge data-wrangling


【解决方案1】:

对于您的示例数据,假设 A 和 B 具有相同的行且顺序相同,以下代码将为您提供所需的输出。

t(t(as.matrix(A[,-1])) %*% as.matrix(B[,-1]))

    abduction abortion academic access
AFG         0        0        0      5
AGO         0        4        4      0
ALB         0        3        3      1
AND         5        1        3      4

这使用矩阵乘法。

对于您的真实数据集(1K 个主题和 190 个国家/地区),您必须检查它们是否包含相同数量的行,并且它们基于公共索引列的顺序是否相同。如果没有,那么您只需要保留那些具有相同的记录,然后按该公共索引列对它们进行排序。这是微不足道的。


数据

> A
  id abduction abortion academic access
1  A         1        0        0      0
2  B         0        1        1      0
3  C         0        0        1      0
4  D         0        0        0      1

> B
  id AFG AGO ALB AND
1  A   0   0   0   5
2  B   0   4   3   1
3  C   0   0   0   2
4  D   5   0   1   4

A <- structure(list(id = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), abduction = c(1, 0, 0, 0), abortion = c(0, 
1, 0, 0), academic = c(0, 1, 1, 0), access = c(0, 0, 0, 1)), row.names = c(NA, 
-4L), class = "data.frame")

B <- structure(list(id = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), AFG = c(0, 0, 0, 5), AGO = c(0, 4, 0, 
0), ALB = c(0, 3, 0, 1), AND = c(5, 1, 2, 4)), row.names = c(NA, 
-4L), class = "data.frame")

【讨论】:

  • 感谢爱德华。事实上,矩阵乘法似乎是最全面的解决方案。它可以在 Excel 和 R 中工作。
【解决方案2】:

首先我建议您研究一下是什么构成了整洁的数据,您应该有一个名为“国家”的列,而不是国家/地区的行。

尝试使用 tidyverse 中的“dplyr”包...

inner_join('Dataset A','Dataset B", by = "column_name")

【讨论】:

  • 感谢丹尼尔。但是,我不打算将数据整理成整齐的格式,因为我打算将其用于网络分析和对应分析,而用于这些类型分析的工具不会吸收整齐,而是广泛。
  • 很高兴知道。谢谢分享
【解决方案3】:

在 Excel 中操作非常简单,假设您有一个带有 Power Query 的版本(基本上是 2010 年以来的任何版本)。

假设您在当前文件中有数据集,格式为 Excel 表,点击数据集一,转到数据 =>“获取和转换数据”并选择“从表/范围”

加载 PQ 后,选择第 1 列并转到 Transform = > Unpivot Columns => Other Columns

这将导致未透视的数据集1

重复上述 3 个步骤,从选择的 dataset2 表开始,这将导致未透视的 dataset2

然后在 PQ 中选择 Dataset1,转到 Home => Merge Queries => Merge Queries as New。在合并窗口中,加入 Column1 上的 2 个数据集

下一步是展开 DataSet2 列,取消选择 Column1,因为它不需要。这将为您提供一个展开的表。

选择 Value 和 Dataset2.Value 列,然后添加列 => 标准 => 乘法

选择 Attribute、Dataset2.Attribute 和 Multiplication 列,然后转到 Home => Remove Columns => Remove Other Columns

选择属性列,然后转到主页 => 透视列。在 Pivot Columns Option 窗口中,选择 Multiplication 作为 Values 列,选择 Sum 作为 Aggregate Value Function。

这将为您提供所需的输出

最后,转到 PQ 窗口左上角的按钮并选择 Close & Load => Close and Load To 并选择作为表格加载到新工作表上,这将为您提供最终输出

根据数据的“位置”,第一部分会有所不同 - 即在 .csv 文件、单独的 Excel 工作簿、数据库等中,但可以调整以适应。此外,您可以更改列名等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2018-10-06
    • 1970-01-01
    • 2021-10-16
    • 2012-12-16
    相关资源
    最近更新 更多