0

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

设数据集 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 上执行此操作的建议。

非常感谢

4

3 回答 3

1

首先我建议你看看是什么让整洁的数据,你应该有一个名为“国家”的列,而不是国家的行。

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

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

于 2020-04-05T02:48:24.147 回答
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")
于 2020-04-05T05:34:32.840 回答
1

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

假设您在当前文件中有数据集,格式为 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 列,然后去 Add Column => Standard => Multiplication

在此处输入图像描述

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

在此处输入图像描述

选择 Attribute 列,然后转到 Home => Pivot Column。在 Pivot Columns Option 窗口中,选择 Multiplication 作为 Values 列,选择 Sum 作为 Aggregate Value Function。

在此处输入图像描述 在此处输入图像描述

这将为您提供所需的输出

在此处输入图像描述

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

在此处输入图像描述 在此处输入图像描述

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

于 2020-04-05T04:47:42.760 回答