数据整理:如何将两个宽格式数据集合并为一个
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")
我有两个宽格式数据集。两者共享一个公共索引列,我想将两个数据集组合成一个基于这个公共列的宽格式数据集。下面提供了数据集的示例。
设数据集 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")