我的数据集如下:
Product_1 Product_2
A B
A A
A C
C D
B C
E E
Z Z
表中所说的是产品A实际上是产品B,那么产品A当然是产品A,产品A也与产品C相同,但考虑到产品C是产品D,最终产品A也是与产品D相同。
我需要在此表中添加一个列,该列将所有相同的产品分组如下:
Product_1 Product_2 Group
A B 1
A A 1
A C 1
C D 1
B C 1
E E 2
Z Z 3
我使用R因此我想到使用包sqldf的递归CTE。 这是一个很大的数据,因此使用矩阵解决问题会让我超过1.3 TB,这是我所不具备的。 有谁知道怎么做?
答案 0 :(得分:1)
此关系为commutative,因此b
计算两个方向的关系,以使以下查询更简单。
closure
是递归CTE,并计算transitive closure,即所有可能的等效产品组合。
ec
计算equivalence classes,即对于每个产品,它计算同一类中最小的产品名称,例如:
A|A B|A C|A D|A E|E Z|Z
g
通过计算有多少较小的class
个不同WITH RECURSIVE b AS (
SELECT product_1, product_2 FROM MyTable
UNION ALL
SELECT product_2, product_1 FROM MyTable
),
closure AS (
SELECT product_1, product_2 FROM b
UNION
SELECT c.product_1, b.product_2
FROM closure AS c
JOIN b ON c.product_2 = b.product_1
),
ec(product, class) AS (
SELECT product_1, MIN(product_2)
FROM closure
GROUP BY product_1
),
g(product, g) AS (
SELECT product,
(SELECT COUNT(DISTINCT class)
FROM ec AS ec2
WHERE ec2.class <= ec.class)
FROM ec
)
UPDATE MyTable
SET "Group" = (SELECT g
FROM g
WHERE product = MyTable.Product_1);
值来计算群组编号:
A|1 B|1 C|1 D|1 E|2 Z|3
- (NSInteger)numberOfRowsInSection:(NSInteger)section;
它的大数据
然后让我们希望你有一个大磁盘用于临时数据...