数据整理:如何将两个宽格式数据集合并为一个

Data wrangling: How to merge two wide format datasets into one

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

设数据集 A 为:

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

设数据集 B 为:



其中第 1 列与数据集 A 中的列表相同,其他列为国家/地区。值是自定义代码,表示 "important" 该文件对特定国家/地区的影响(例如,5 非常重要,1 不重要,0 表示未参与该文件)。

我想将两者组合成一个单一的宽数据集,其中行是国家,列是主题。单元格内的值将等于一个国家通过文档参与主题的次数总和,由数据集 B 上的 "importance" 编码加权。

完成的数据集如下所示:



例如,AFG 只参与了文件 A/C.3/64/L.6,重要性为 5,由于该文件只提到 "Access to information",AFG 对该主题的参与度为 5。AND,反过来, 参与了所有文件,因此参与了主题 "Abduction" (1*5=5), "Abortion" (1*1=1), "Academic degree" (1*1 + 1* 2=3) 和 "Access to information" (1*4=4)。

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

非常感谢

首先,我建议您查看 Tidy 数据的来源,您应该有一个名为 "country" 的列,而不是国家/地区的行。

尝试使用 tidyverse 中的 "dplyr" 包...

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

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

假设您在当前文件中有数据集,格式为 Excel tables,单击数据集一,转到数据 => "Get & Transform Data" 并选择 "From Table/Range"

PQ 加载后,select 第 1 列并进行转换 => 逆透视列 => 其他列

这将导致未旋转的数据集 1

重复上述 3 个步骤,从数据集 2 table selected 开始,这将产生一个未旋转的数据集 2

然后 select PQ 中的 Dataset1,转到主页 => 合并查询 => 合并查询为新的。在 Merge Window 中,加入 Column1

上的 2 个数据集

下一步是扩展 DataSet2 列,unselect Column1 因为它不是 needed.This 将为您提供扩展的 table.

Select 值和 Dataset2.Value 列并转到添加列 => 标准 => 乘法

Select 属性、Dataset2.Attribute 和乘法列并转到主页 => 删除列 => 删除其他列

Select 属性列,然后转到主页 => 数据透视列。在数据透视列选项中 window select 乘法作为值列,总和作为聚合值函数。

这将为您提供所需的输出

然后最后,转到 PQ window 中左上角的按钮并选择关闭并加载 => 关闭并加载到并选择作为 table 加载到新的 sheet,这将为您提供最终输出

第一部分会有所不同,具体取决于 'where' 数据是 - 即在 .csv 文件中,单独的 Excel 工作簿,在数据库等中,但可以进行调整以适应。此外,您还可以更改列名等。

对于您的示例数据,假设 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

这使用矩阵乘法。

对于您的真实数据集(1000 个主题和 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")