我这样做。我一遍又一遍地得到同样的错误。提前谢谢。
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")
答案 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;。有很多方法可以做到这一点。我选择的是简单计算动物i
和j
共有的属性数量。这对应于zoo
中zoo[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}}上的文档。