就内存空间而言,最佳解决方案是每对一行,即 700*699 / 2。这个问题仍然相对较小,并且操作 700*700 矩阵的简单性可能比 700*701/ 更有价值您要保存 2 个单元格,每个单元格 1 个字节,总计 240kB。如果矩阵是稀疏的(即大多数材料对从未排序在一起)并且您使用适当的数据结构,则它可能会更少。
代码如下所示:
首先,我们要创建一个具有与材料一样多的行和列的数据框。矩阵更容易创建,因此我们创建一个矩阵,然后将其转换为数据帧。
all_materials = levels(as.factor(X$Materials))
number_materials = length(all_materials)
Pairs <- as.data.frame(matrix(data = 0, nrow = number_materials, ncol = number_materials))
(这里,X是你的数据集)
然后,我们设置行名和列名,以便能够直接使用材料的标识符来访问行和列,这些材料显然不一定是从 1 到 700 编号的。
colnames(Pairs) <- all_materials
rownames(Pairs) <- all_materials
然后我们迭代数据集
for(order in levels(as.factor(X$Order.number))){
# getting the materials in each order
materials_for_order = X[X$Order.number==order, "Materials"]
if (length(materials_for_order)>1) {
# finding each possible pair from the materials list
all_pairs_in_order = combn(x=materials_for_order, m=2)
# incrementing the cell at the line and column corresponding to each pair
for(i in 1:ncol(all_pairs_in_order)){
Pairs[all_pairs_in_order[1, i], all_pairs_in_order[2, i]] = Pairs[all_pairs_in_order[1, i], all_pairs_in_order[2, i]] + 1
}
}
}
在循环结束时,Pairs
表应该包含您需要的一切。