我想找到一种有效的方法来确定一个数字对表的整个层次类型关系,然后用向量或字符串表示这种关系,这样我就可以确定关于每个数字对的层次结构的其他有用信息,例如最高相关整数,最低相关整数和相关整数的总数。
例如,我有一个整数对表:
X Y
--- ---
5 10
5 11
11 12
11 13
13 3
20 18
17 18
50 18
20 21
字符串
如果一个记录对中的任何一个值被另一个记录对中的任何其他值共享,则该记录与另一个记录相关。最终的表看起来像这样:
X Y Related ID's
--- --- ---------------
5 10 3,5,10,11,12,13
5 11 3,5,10,11,12,13
11 12 3,5,10,11,12,13
11 13 3,5,10,11,12,13
13 3 3,5,10,11,12,13
20 18 17,18,20,21,50
17 18 17,18,20,21,50
50 18 17,18,20,21,50
20 21 17,18,20,21,50
型
我现在所做的是无可否认的混乱。它使用一个带有匹配函数的fuzzy_join,该函数将x,y作为向量并在它们之间进行匹配。该匹配然后创建一个包含所有四个匹配数字的更大向量,该向量返回fuzzy_join再次进行匹配。这会循环,直到没有更多的匹配。它很快变得很糟糕,在大约4k记录时,它不再响应。整个初始对表将保持< 100k记录
5条答案
按热度按时间sulc1iza1#
在R中,你可以这样做:
字符串
如果你安装了
igraph
,你可以:型
编辑:
如果我们比较函数的速度,请注意,在我上面的函数中,最后一个语句ie
sapply(dat[,1], ...)
即使在计算之前也会计算每个元素的值。例如sapply(c(5,5,5,5)...)
将计算组4次而不是一次。现在用途:型
现在执行基准测试:
型
pod7payv2#
igraph
的另一种选择字符串
使得
型
7y4bm7vi3#
我想你也可以在
tidyverse
中做类似的事情(我使用了一个精心设计的框架,增加了一些行)。这个策略将保持accumulate
(累积)related_ids。这里id
只是一个rowid,没有任何特殊用途。你也可以放弃这一步。字符串
创建于2021-06-01由reprex package(v2.0.0)
rryofs0p4#
这远不如Onyambu的基本R答案那么优雅,但我的基准测试速度快了4到5倍。它的工作原理是将每行分配给一个组,将其内容添加到该组中所有数字的集合中,然后找到下一个未分配的行,该行至少有一个成员在集合中。一旦没有更多的匹配行,它就会跳转到下一个未分配的行。
字符串
因此,您可以:
型
和
型
fzsnzjdm5#
已更新我觉得你也可以使用下面的解决方案,虽然比较繁琐,但我觉得还是很有效的:
字符串
我还尝试了@AnilGoyal精心制作的数据框架:
型