igraph:来自get.adjacency的错误消息:不是图形对象

时间:2014-12-11 22:31:24

标签: r igraph

我这样做。我一遍又一遍地得到同样的错误。提前谢谢。

library(igraph)
library(sand)

zoo=read.csv("C:\\Documents and Settings\\kkk\\Desktop\\moo.data",header=FALSE)

a<-get.adjacency(moo)
**Error in get.adjacency(zoo) : Not a graph object**

V(moo)
**Error in V(moo) : Not a graph object**

编辑评论的更多信息

我正在运行以下命令并收到以下错误。

library(igraph) 
library(igraphdata) 
library(sand) 

zoo=read.csv("C:\\Documents and Settings\\kkk\\Desktop\\zoo.data",header=FALSE) 
a <- get.adjacency(zoo) 
# Error in get.adjacency(zoo) : Not a graph object 

vcount(zoo)
# Error in vcount(zoo) : Not a graph object 

我如何知道支持动物园数据的图形对象是什么

数据

数据集20 rows的第一个zoo。 (here提供的完整数据,说明为here

zoo <- structure(list(V1 = c("aardvark", "antelope", "bass", "bear", 
"boar", "buffalo", "calf", "carp", "catfish", "cavy", "cheetah", 
"chicken", "chub", "clam", "crab", "crayfish", "crow", "deer", 
"dogfish", "dolphin"), V2 = c(1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), V3 = c(0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, 0L), V4 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 
1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L), V5 = c(1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L), V6 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L), V7 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 
0L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L), V8 = c(1L, 0L, 1L, 1L, 1L, 
0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L), 
    V9 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 
    0L, 0L, 0L, 0L, 1L, 1L, 1L), V10 = c(1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L
    ), V11 = c(1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 
    0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L), V12 = c(0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L), V13 = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 
    0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), V14 = c(4L, 4L, 0L, 
    4L, 4L, 4L, 4L, 0L, 0L, 4L, 4L, 2L, 0L, 0L, 4L, 6L, 2L, 4L, 
    0L, 0L), V15 = c(0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 
    1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L), V16 = c(0L, 0L, 
    0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), V17 = c(1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 
    0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L), V18 = c(1L, 
    1L, 4L, 1L, 1L, 1L, 1L, 4L, 4L, 1L, 1L, 2L, 4L, 7L, 7L, 7L, 
    2L, 1L, 4L, 1L)), .Names = c("V1", "V2", "V3", "V4", "V5", 
"V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V14", "V15", 
"V16", "V17", "V18"), row.names = c(NA, 20L), class = "data.frame")

1 个答案:

答案 0 :(得分:7)

你的问题相当含糊,所以这是对你想要完成的事情的一点猜测。您似乎试图从图形创建邻接矩阵,但您没有。因此,在您的情况下,您必须首先创建邻接矩阵,然后从中创建图形。

您链接的文件是一个csv文件,其中包含有关101只动物(行中)的属性数据。除了动物的名字外,还有17个属性(在列中)。通常,如果动物具有该属性,则元素为1,否则为0。有两个例外,这有点复杂:第14列有腿数,第18列有动物&#34;类&#34;,1和7之间的整数。从某种意义上说,这两个都是绝对的变量。重点是,不是图形对象。

假设您想将此视为图形,并且动物(行)将是顶点,则邻接矩阵是方形矩阵(在这种情况下为101 X 101),其中每个元素[i,j]确定&#34;强烈联系&#34;动物i是动物j

邻接矩阵是相似性矩阵的一种特殊情况,其中每个元素[i,j]是一个度量,它捕获&#34;类似的&#34;行i是行j。要创建一个我们首先需要定义&#34;相似性&#34;。有很多方法可以做到这一点。我选择的是简单计算动物ij共有的属性数量。这对应于zoozoo[i,col]==zoo[j,col]的列数,不包括两行包含0的列。幸运的是,使用dist(...) proxy函数中的url <- "https://archive.ics.uci.edu/ml/machine-learning-databases/zoo/zoo.data" zoo <- read.csv(url,header=FALSE,stringsAsFactors=FALSE) library(proxy) sim <- function(x,y) sum(x==y) - sum(x==0 & y==0) adj.M <- as.matrix(dist(zoo[-c(1,18)],method=sim)) adj.M[1:5,1:5] # 1 2 3 4 5 # 1 0 7 3 8 8 # 2 7 0 3 7 8 # 3 3 3 0 3 4 # 4 8 7 3 0 8 # 5 8 8 4 8 0 函数非常容易封装

sim(x,y)

因此,动物1和2的相似性得分为7,这意味着共有7个属性。动物1和3的得分为3,这意味着它们共有3个属性,等等。

函数dist(...)被定义为计算两行之间的相似性,函数zoo将此函数应用于igraph中的每个行组合,不包括第1列和第18列。排除第1列,因为它有名称,第18列,因为它有&#34;类&#34;这大概来源于其他专栏中的信息。

如果你想要的只是邻接矩阵,你可以在这里停下来,而不必诉诸igraph。如果您想利用igraph中的功能来分析和可视化动物之间的关系,那么您必须创建一个# colnames(adj.M) <- zoo[[1]] # uncomment to display animal names in plot g <- graph.adjacency(adj.M, weighted=TRUE, mode="undirected") 对象。

g

所以g是一个无向图,边缘权重来自邻接矩阵。现在,我们可以仅根据边权重计算communities <- leading.eigenvector.community(g) groups <- membership(communities) # do groups map to animal "class" from data? by(zoo[c(1,18)],groups,print) 的社区结构。

class=1

这基本上将动物分组,使得给定组中的动物与同一组中的其他动物的连接(较大的边缘重量)比与其他组中的动物的连接更高。通过检查上面最后一行的输出,您可以看到这种方法成功地将所有动物从igraph放入第1组,并且通常将动物从第4组,第5组和第7组放入第2组,并且动物来自第2组第3组中的2,3和6。

作为使用sub.g <- induced.subgraph(g,V(g)[1:20]) # just the first 20 animals communities <- leading.eigenvector.community(sub.g) groups <- membership(communities) set.seed(1) # for reproducible layout plot(sub.g, layout=layout.fruchterman.reingold(sub.g,weights=E(sub.g)$weight), vertex.color=groups+1) 进行可视化的示例,我们仅使用前20只动物创建一个新图形,如上所述计算社区结构,并绘制具有基于组颜色编码的顶点的图形。 Fruchterman-Reingold布局尝试放置顶点,使边缘权重较高的顶点更靠近。

?graph.adjacency

显然,要利用这一点,您需要至少了解或学习一下图论。至少,您应该阅读?communities?layout和{{1}}上的文档。