2

如果这个问题看起来多余,我深表歉意,但我开始在课堂上使用 R 及其 SNA 工具,并且已经运行了几个不同的教程/实验室来习惯。一个总是被推荐的资源是斯坦福大学的 SNA 实验室,但即使只是运行介绍性实验室也会返回许多让我感到困惑的错误。带有注释的完整 R 代码可在此处获得:

http://sna.stanford.edu/lab.php?l=1

第一部分相当直截了当,我了解大部分情况。但是一旦我尝试向图形添加顶点属性(从第 236 行开始),我遇到了我们刚刚创建的图形对象“krack_full”的问题。运行这个...:

for (i in V(krack_full)) {
    for (j in names(attributes)) {
        krack_full <- set.vertex.attribute(krack_full, 
                                           j, 
                                           index = i, 
                                           attributes[i + 1, j])
    }
}

...返回这个:

Error in set.vertex.attribute(krack_full, j, index = i, attributes[i +  : 
  unused argument (index = i)

所以我认为,很好,使用他们概述的第二种方法,然后继续:

attributes = cbind(1:length(attributes[,1]), attributes)
krack_full <- graph.data.frame(d = krack_full_nonzero_edges, 
+ vertices = attributes) 

这似乎工作正常 - 除了它实际上创建了一个名为“(1:长度(属性[,1])”的属性......

> summary(krack_full)
IGRAPH DN-- 21 232 -- 
attr: name (v/c), 1:length(attributes[, 1]) (v/n), AGE (v/n), TENURE (v/n), LEVEL (v/n), DEPT
  (v/n), advice_tie (e/n), friendship_tie (e/n), reports_to_tie (e/n)

所以,一切都已经很奇怪了。最后,当我尝试在下一步中获取顶点属性时,我遇到了一些关于对象类的错误:

> get.vertex.attribute(krack_full, 'AGE')
Error in get.vertex.attribute(krack_full, "AGE") : 
  get.vertex.attribute requires an argument of class network.
> get.vertex.attribute(krack_full, 'TENURE')
Error in get.vertex.attribute(krack_full, "TENURE") : 
  get.vertex.attribute requires an argument of class network.
> get.vertex.attribute(krack_full, 'LEVEL')
Error in get.vertex.attribute(krack_full, "LEVEL") : 
  get.vertex.attribute requires an argument of class network.
> get.vertex.attribute(krack_full, 'DEPT')
Error in get.vertex.attribute(krack_full, "DEPT") : 
  get.vertex.attribute requires an argument of class network.

...从这里开始,几乎没有什么能像我预期的那样工作。所以我怀疑导入数据的图形对象“krack_full”不是它应该是的......?

再次,如果我犯了一个完全的新手错误,我很抱歉,但如果你能指出我正确的方向,我将不胜感激。我想更好地了解这里发生了什么。

非常感谢。

4

2 回答 2

2

我强烈怀疑您尝试遵循的教程是为 igraph 0.5.4 或更早版本开发的。那时,igraph 对象中的顶点和边是从零开始索引而不是从一开始的,从教程中的以下评论来看,教程似乎解释了这一点:

# IMPORTANT NOTE: Unlike in most languages, R objects are numbered
# from 1 instead of 0, so if you want the first element in a
# vector, you would reference it by vector_name[1]. HOWEVER,
# igraph objects are numbered starting from 0. This can lead to 
# lots of confusion, since it's not always obvious at first which 
# objects are native to R and which belong to igraph.

从 igraph 0.6 开始,这不再是真的了;igraph 的 R 接口中的顶点和边从 1 开始索引,就像所有其他表现良好的 R 对象一样。您在这里有两个选择(除了要求教程的作者为 igraph 0.6 更新它):

  1. 您可以修改教程中的命令以确保每个顶点和边索引都是从 1 开始的;即,如果他们出于某种原因从某处的索引中减去 1,则只需省略减法,同样,如果他们在某处的索引中添加 1,则省略加法。这也是检查您是否真正了解自己在做什么的好方法:)

  2. 使用igraph0包而不是igraph. 该igraph0软件包与 相同,igraph但使用从零开始的索引来确保旧的 igraph 代码在过渡期间仍然有效。但是,您应该继续使用igraph新的分析项目。

于 2013-07-08T16:06:11.450 回答
1

对于函数

get.vertex.attribute 

试试新功能

vertex_attr 

反而

于 2015-12-23T16:54:48.500 回答