igraph对象的顶点/节点属性

3

我正在使用igraph处理网络分析数据,以下是一个示例数据框:

df_edgelist=structure(list(Nominator = structure(c(6L, 4L, 7L, 8L, 1L, 2L, 
3L, 5L), .Label = c("Andrea", "Dan", "Dan", "Greg", "Jerry", 
"Jim", "Rachel", "Sarah"), class = "factor"), Nominee = structure(c(5L, 
2L, 8L, 1L, 7L, 3L, 6L, 4L), .Label = c("Andrea", "Dan", "Greg", 
"Jeff", "Jerry", "Jerry", "Sarah", "Tim"), class = "factor"), 
    Age_Nominator = c(24L, 25L, 29L, 45L, 43L, 67L, 67L, 45L)), class = "data.frame", row.names = c(NA, 
-8L))

这里的文档中,我得出的印象是,如果我还提供另一个数据帧并在graph_from_dataframevertices参数中设置该数据帧的名称,则graph_from_dataframe函数将把第3列Age_Nominator作为顶点属性处理。那么这是正确的吗?还是df_edgelist中的第3列仍然是边属性?

1
变量Age_Nominator具有与边对应的值。例如,在数据框的第一行中,24适用于Jim还是Jerry?Igraph默认将其加载为边属性。如果您希望它作为顶点属性,则需要创建一个数据框,其中每个命名的顶点对应一个属性值。 - gfgm
好的,这样更有意义了,但我不确定是因为文档有点混乱。所以当我加载顶点属性数据帧时,如果我加载的数据帧具有未包含在特定边缘列表中的额外名称,是否重要?我正在使用多个不同的边缘列表,但有一个包含每个边缘列表中所有顶点属性的数据帧,并且希望仅使用该数据帧而不是将其拆分。 - Jin
1个回答

4
graph_from_data_frame函数中有两个关键参数dvertices。正如评论中所讨论的那样,d中的额外列会成为边的属性,而vertices中的额外列(其中第一列是顶点名称)将成为顶点的属性。
另外,如果vertices不为NULL,则会检查d中给出的符号边缘列表,以确保仅包含在vertices中列出的顶点名称。
这意味着d的前两列不能提及在vertices中不存在的任何顶点。另一方面,如果vertices有一些额外顶点,也不会有问题,它们将简单地被孤立。
例如:
df_vertices <- data.frame(someNames = c("NewName", as.character(unique(unlist(df_edgelist[, 1:2])))))
df_vertices$Age <- 20 + 1:nrow(df_vertices)
df_vertices
#    someNames Age
# 1    NewName  21
# 2        Jim  22
# 3       Greg  23
# 4     Rachel  24
# 5      Sarah  25
# 6     Andrea  26
# 7        Dan  27
# 8      Jerry  28
# 9        Tim  29
# 10      Jeff  30

这样我们考虑了所有必要的顶点,并添加了一个额外的NewName。然后

g <- graph_from_data_frame(df_edgelist, vertices = df_vertices)
# V(g)$Age
#  [1] 21 22 23 24 25 26 27 28 29 30
V(g)$name
#  [1] "NewName" "Jim"     "Greg"    "Rachel"  "Sarah"   "Andrea"  "Dan"     "Jerry"   "Tim"    
# [10] "Jeff"   
E(g)
# + 8/8 edges from 7f024f1 (vertex names):
# [1] Jim   ->Jerry  Greg  ->Dan    Rachel->Tim    Sarah ->Andrea Andrea->Sarah  Dan   ->Greg  
# [7] Dan   ->Jerry  Jerry ->Jeff  

正如预期的那样。如果您想避免那些孤立的顶点,您可以指定vertices

df_vertices[df_vertices$someNames %in% as.character(unique(unlist(df_edgelist[, 1:2]))), ]
#    someNames Age
# 2        Jim  22
# 3       Greg  23
# 4     Rachel  24
# 5      Sarah  25
# 6     Andrea  26
# 7        Dan  27
# 8      Jerry  28
# 9        Tim  29
# 10      Jeff  30

请你看一下这个问题:https://stackoverflow.com/questions/64870651/r-language-understanding-what-is-a-weighted-graph - stats_noob
1
在igraph中是否可以添加节点权重?图聚类算法能否利用节点权重(而不是边权重)? - stats_noob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接