R 从数据集中查找已连接用户组
目前,我正致力于从具有给定结构的数据集中实现“关系提取”功能:R 从数据集中查找已连接用户组,r,feature-extraction,R,Feature Extraction,目前,我正致力于从具有给定结构的数据集中实现“关系提取”功能: Name1 Name2 Bob Tom Mike Bob Denise John Kate Bob John Kate Mike Tom Mark Denise Denise Kate Tom John 这两列都是“character”类型,基本上数据集包含“Name1”用户知道“Name2”用户的信息(对称关系)。 我想做的是找到“每个人都认识每个人”的用户组(我不确定他们在英语中是如何称呼的,
Name1 Name2
Bob Tom
Mike Bob
Denise John
Kate Bob
John Kate
Mike Tom
Mark Denise
Denise Kate
Tom John
这两列都是“character”类型,基本上数据集包含“Name1”用户知道“Name2”用户的信息(对称关系)。
我想做的是找到“每个人都认识每个人”的用户组(我不确定他们在英语中是如何称呼的,我的讲师称他们为“超级组”)。该函数的输出应该包含提取组的列表和每个组的成员列表。因此,对于上面的示例数据集,它应该是(当组有3个或更多成员时,它被认为是“有效的”):
格式真的没那么重要,它只需要包含那种信息。现在,我实际实现了一个可以工作的函数,但执行时间非常长(对于具有约55万行的数据集,大约需要9个小时)-我所做的基本上是为每个关系创建朋友子集,因此对于示例数据中的关系Bob-Tom,它将如下所示:
Subset 1:
Name1 Name2
Bob Mike
Bob Kate
Subset 2:
Name1 Name2
Tom Mike
Tom John
然后我检查了第一个子集中“Name2”列的用户是否出现在第二个子集中的同一列中,等等。。。我知道这个方法远远不是最优的,我对执行这个函数需要这么长时间一点也不感到惊讶。我想知道是否有人能为这个问题提出更好的解决方案(我甚至不需要代码,只需要链接到某个算法或解释如何以最佳方式进行这种“组提取”)正如Frank所评论的,您正在描述一个典型的图论问题 图是一种结构,它具有节点(在您的案例中是人)和其中一些节点(在您的案例中是友谊关系)之间的边 事实上,您正在寻找的“超级组”有一个词:节点子集,其中每个节点都连接到该子集中的其他节点,称为团或完全连接子图。特别是,你似乎对所有基数为3或更大的派系都感兴趣 好消息是,查找所有派系是图论(The)中的一个众所周知的问题,包中的实现也存在(见下文)。坏消息是它是NP完全的。因此,根据大小和拓扑图,即使是最好的实现也可能需要相当长的时间。上面的文章提供了一些关于这方面的进一步信息
R中的
igraph
包提供了一个cliques
函数,一旦您将数据加载为图形结构,该函数将为您查找这些cliques。在您的案例中,您有一个现有关系的列表,我建议您查看该包中的graph\u from\u edgelist
函数。正如Frank所评论的,您正在描述一个典型的图论问题
图是一种结构,它具有节点(在您的案例中是人)和其中一些节点(在您的案例中是友谊关系)之间的边
事实上,您正在寻找的“超级组”有一个词:节点子集,其中每个节点都连接到该子集中的其他节点,称为团或完全连接子图。特别是,你似乎对所有基数为3或更大的派系都感兴趣
好消息是,查找所有派系是图论(The)中的一个众所周知的问题,包中的实现也存在(见下文)。坏消息是它是NP完全的。因此,根据大小和拓扑图,即使是最好的实现也可能需要相当长的时间。上面的文章提供了一些关于这方面的进一步信息
R中的
igraph
包提供了一个cliques
函数,一旦您将数据加载为图形结构,该函数将为您查找这些cliques。在您的案例中,您有一个现有关系列表,我建议您查看该软件包中的graph\u from\u edgelist
函数。您所描述的内容听起来像图论中的派系。首先,我们加载您的示例数据
dd <- read.table(text="Name1 Name2
Bob Tom
Mike Bob
Denise John
Kate Bob
John Kate
Mike Tom
Mark Denise
Denise Kate
Tom John", header=T)
你所描述的听起来像图论中的派系。首先,我们加载您的示例数据
dd <- read.table(text="Name1 Name2
Bob Tom
Mike Bob
Denise John
Kate Bob
John Kate
Mike Tom
Mark Denise
Denise Kate
Tom John", header=T)
计算内聚块可以为您提供一些见解:
library(igraph)
camp <- graph_from_literal(Bob -Tom,
Mike -Bob,
Denise -John,
Kate - Bob,
John - Kate,
Mike - Tom,
Mark - Denise,
Denise - Kate,
Tom - John)
campBlocks <- cohesive_blocks(camp)
campBlocks
plot(campBlocks, camp, vertex.label=V(camp)$name, margin=-0.2,
vertex.shape="rectangle", vertex.size=24, vertex.size2=8,
mark.border=1, colbar=c(NA, NA,"green","orange") )
输出:
3/7 vertices, named:
[1] John Denise Kate
[[2]]
3/7 vertices, named:
[1] Bob Tom Mike
计算内聚块可以为您提供一些见解:
library(igraph)
camp <- graph_from_literal(Bob -Tom,
Mike -Bob,
Denise -John,
Kate - Bob,
John - Kate,
Mike - Tom,
Mark - Denise,
Denise - Kate,
Tom - John)
campBlocks <- cohesive_blocks(camp)
campBlocks
plot(campBlocks, camp, vertex.label=V(camp)$name, margin=-0.2,
vertex.shape="rectangle", vertex.size=24, vertex.size2=8,
mark.border=1, colbar=c(NA, NA,"green","orange") )
输出:
3/7 vertices, named:
[1] John Denise Kate
[[2]]
3/7 vertices, named:
[1] Bob Tom Mike
看看igraph软件包。图论是你描述的标准工具。看看igraph软件包。图论是你描述的标准工具。
3/7 vertices, named:
[1] John Denise Kate
[[2]]
3/7 vertices, named:
[1] Bob Tom Mike