如何在R中列出所有图形顶点属性?

13

我在R中使用igraph软件包。

我想要将一些数据与每个顶点相关联,例如通过向每个顶点添加id和描述属性。这些属性是在运行时确定的。关于如何设置和获取此数据,我有几个相关问题。

要设置顶点的id,我使用以下命令(其中g是一个图):

> set.vertex.attribute(g,'id',1,'first_id') # etc

我期望能够通过以下方式读取属性:

> get.vertex.attribute(g,'id',1)

但是这会返回NULL。我做错了什么吗?

此外,使用 get.vertex.attribute 的函数无法访问属性名称列表。 我如何从图形 g 中提取属性名称?

最后,我想从/到命名列表设置/获取属性的值。 有没有一种简单的方法可以做到这一点,而不必遍历每个顶点和属性并应用 set.get.vertex.attribute

谢谢!


有过同样的经历。感谢您的发布。 - Michael Davidson
2个回答

13
看起来你需要将 set.vertex.attribute 的结果重新分配给 g,代码如下:
g <- graph.data.frame(data.frame(one=1:2,two=2:3))
g <- set.vertex.attribute(g,'id',1,'first_id')
get.vertex.attribute(g,'id',1)
#[1] "first_id"

如同 ?get.vertex.attribute 的帮助文件中所述:

graph:要操作的图形对象。请注意,原始图形永远不会被修改,而是返回一个新的图形对象;如果您不将其分配给变量,则您的修改将丢失!请参见下面的示例。

此外,从同一帮助文件中可以得知...

list.graph.attributes、list.vertex.attributes 和 list.edge.attributes 返回一个字符向量,表示存在的属性名称。

list.vertex.attributes(g)
#[1] "name" "id"  

从一个快速的查看中,似乎没有一个简单的函数可以批量读取/写入顶点属性。不过你可以像这样构建一个函数:

lapply(list.vertex.attributes(g),function(x) get.vertex.attribute(g,x))
#[[1]]
#[1] "1" "2" "3"
# 
#[[2]]
#[1] "first_id" NA         NA  

这一定是一个新功能,但以下命令非常方便,可以提取所有顶点属性数据:get.data.frame()。 - Michael Davidson

7
使用以下语法来在原地分配顶点属性:
> V(g)[1]$id <- "first_id"
> V(g)[1]$id
[1] "aaa"

这个语法也允许您为所有顶点检索或设置顶点属性;只需省略索引:

> V(g)$id <- c("aa", "bb", "cc")

这个代码很好用,但是你能帮我解决一个问题吗?:我只有一个变量来表示属性名,例如idName = "id"。虽然 V(g)$id 很好用,但是 V(g)[[idName]] 给了我一个错误提示 Error in V(g)[[idName]] : subscript out of bounds。请问我该如何使用 idName 来引用它呢?谢谢! - Racing Tadpole
我不是R语言的专家,所以我不知道是否有更简单的方法,但经过一些尝试,我发现这个方法可行:eval(parse(text=paste("V(g)$", varname, sep="")))。这基本上创建了一个包含要评估的表达式的字符串,解析它,然后调用eval来评估该表达式。 - Tamás
不可以使用 V(g)$ 这种方式。实际上,这和普通列表是一样的,如果 element 是一个变量名,你也不能使用 list$element 这种方式。在这种情况下,你需要使用 get.vertex.attributeset.vertex.attribute - Gabor Csardi

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