【发布时间】:2019-10-26 03:40:22
【问题描述】:
我的数据包含两列(可能更多)标识符(通常是长字符串)。这些有时会有所不同,输入错误或随时间而变化。我想识别数据中的独特主题。这需要识别在某个级别通过其 id 连接的案例组。
一个例子
df <- data.frame(ida = c("A", "B", "C", "C", "D", "E"),
idb = c(1, 1, 3, 4, 4, 7),
trueid = c("id1", "id1", "id2", "id2", "id2", "id3"))
> df
ida idb trueid
1 A 1 id1
2 B 1 id1
3 C 3 id2
4 C 4 id2
5 D 4 id2
6 E 7 id3
id1 的标识符是 "A", "B", 1,id2 "C", "D", 3, 4 和 id3 "E", 7。
我不知道trueid,但需要使用ida 和idb 列中的信息找到它。
该解决方案需要扩展到具有数万个唯一 ID 的数百万个观测值。我已经在使用data.table。
扩展:还有另一种情况,其中有两个以上的列,有些列可能对其他列提供信息,即具有相同的标识符。我不知道哪些栏可以提供哪些信息。我认为类型可以忽略,所有列都是字符串或者可以安全地转换。
另一个例子:
df <- data.frame(ida = c("A", "B", "C", "C", "D", "E"),
idb = c("1", "2", "3", "4", "4", "7"),
idc = c("1", "1", "2", "3", "4", "5"),
idd = c("1", "A", "2", "3", "4", "5"),
trueid = c("id1", "id1", "id1", "id1", "id1", "id2"))
> df
ida idb idc idd trueid
1 A 1 1 1 id1
2 B 2 1 A id1
3 C 3 2 2 id1
4 C 4 3 3 id1
5 D 4 4 4 id1
6 E 7 5 5 id2
编辑:正如评论者指出的那样,这本质上是在图中找到完整子图的集团问题。在阅读了更多之后,我知道这个问题可以通过library(igraph) 解决。我将问题悬而未决,因为我更喜欢依赖base、data.table 或dplyr 的解决方案。我无法在我正在使用的服务器上轻松安装软件包,安装 igraph 涉及处理大量繁文缛节和延迟。
Edit2:对于任何阅读本文并面临类似问题的人:zx8754 使用 igraph 的答案在具有更多组的较大(模拟)数据上要快得多(几个数量级)。如果您有机会使用igraph,请这样做。
【问题讨论】:
-
将案例视为唯一 ID 的规则是什么?
-
通过某个 id 链接到任何其他案例的案例。我稍微改述了这个问题。在第一种情况下,
id1的标识符是"A", "B", "1",id2"C", "D", 3, 4和id3"E", 7。 -
这听起来像是一个识别“团”的网络分析问题,其中每个节点之间存在一条边,至少有一个公共变量,每个
trueid是一个“完整子图”,其中节点可以通过有限的步骤连接起来。 -
是的,本质上就是这样。我正在寻找不依赖 igraph 或更具体的包的解决方案。
-
为什么不 igraph?
标签: r dataframe dplyr data.table igraph