我有两个宽格式的数据集。两者共享一个公共索引列,我希望基于这个公共列将两个数据集合并成一个单一的宽格式数据集。下面提供了数据集的样本。
将数据集A设为:

其中第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上这样做,我将不胜感激。
非常感谢
发布于 2020-04-05 05:34:32
对于示例数据(假设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-05 02:48:24
首先,我建议您研究Tidy数据的构成,您应该有一个名为"country“的列,而不是国家行。
试着用"dplyr“包.
inner_join('Dataset A','Dataset B", by = "column_name")
发布于 2020-04-05 04:47:42
在Excel中做起来非常简单,假设您有一个带有Power Query的版本(基本上是2010年以来的任何版本)。
假设您将当前文件中的数据集格式化为Excel表,单击Dataset one,转到Data => "Get & Transform Data“并选择"From Table/Range”

加载PQ后,选择第1列,然后转换=> Un枢轴列=>其他列

,这将导致一个无轴的dataset1

重复上面的三个步骤,从所选的dataset2表开始,这将导致一个未旋转的dataset2

然后在PQ中选择Dataset1,转到主=>合并查询=>合并查询作为新建。在合并窗口中,加入Column1上的2个数据集


下一步是展开DataSet2列,取消选择Column1 (因为它不是needed.This )将为您提供一个展开的表。


选择Value和Dataset2.Value列并添加列=>标准=>乘法

选择属性Dataset2.Attribute和乘法列,然后转到主=>删除列=>删除其他列

选择属性列,然后转到Home =>数据透视列。在数据透视列选项窗口中,选择乘法作为值列,选择和作为聚合值函数。


这将为您提供所需的输出。

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


第一部分将根据数据的“位置”略有不同--即在.csv文件中、单独的Excel工作簿中、数据库中等等,但是可以根据需要进行调整。此外,您还可以更改列名等。
https://stackoverflow.com/questions/61037210
复制相似问题