【问题标题】:valued bipartite projection using R igraph使用 R igraph 的值二分投影
【发布时间】:2015-08-31 05:23:34
【问题描述】:

我正在尝试从我的数据创建有价值的二分投影,如下所示:

                 Name   rid
                Emile    17560
                Lou     11800
                Luther   11800
                Tot     11800
                Phineas   11800
                Phineas   13580
                Calvin    13580
                Calvin    11800
                  Les      11800
                 Jeff      11800
                 Sonny     13580
                  Leon      13580
                  Red       13580

我把上面的数据导入了,叫data1

然后我执行以下操作:

##create graph object from data1
graph1 <- graph.data.frame(data1)

#check if it is bipartite
is.bipartite(graph1)
FALSE

##convert to bipartite graph
V(graph1)$type <- V(graph1)$name %in% data1[,1]

##check again if it is bipartite
is.bipartite(graph1)
TRUE

##create biparite projection
 ##the multiplicity argument is suppose to count the number of 
 ##edges
 proj<-bipartite.projection(graph1, V(graph1)$type,multiplicity = TRUE)

##get adjacency matrix from second projection
get.adjacency(proj$proj2)

我得到以下输出

 11 x 11 sparse Matrix of class "dgCMatrix"
  [[ suppressing 11 column names ‘Emile ’, ‘Lou ’, ‘Luther ’ ... ]]

   Emile    . . . . . . . . . . .
   Lou      . . 1 1 1 . 1 1 1 . .
   Luther   . 1 . 1 1 . 1 1 1 . .
   Tot      . 1 1 . 1 . 1 1 1 . .
   Phineas  . 1 1 1 . . 1 1 1 . .
   Phineas  . . . . . . 1 . . 1 1
   Calvin   . 1 1 1 1 1 . 1 1 1 1
   Les      . 1 1 1 1 . 1 . 1 . .
   Jeff     . 1 1 1 1 . 1 1 . . .
   Sonny    . . . . . 1 1 . . . 1
   Leon     . . . . . 1 1 . . 1 .

     3 x 3 sparse Matrix of class "dgCMatrix"
                17560 11800 13580
        17560     .     .     .
        11800     .     .     1
       13580     .     1     .

PhineasCalvin 通过 ***rid***s 13580 和 11800 有 2 条边,Phineas 出现了两次。而“摆脱”投影图仅显示 13580 和 11800 之间的 1 条边。“名称”图显示了 Phineas 两次。

感谢任何修改此代码以获得有价值的投影和邻接矩阵的建议。谢谢!

编辑 #1:Phineas 出现了两次,原因是某种格式问题,其中两个“Phinease-s”被识别为单独的名称。但是,解决这个问题仍然不能解决主要问题。输出仍然只给出 Phineas 和 Calvin 之间以及 13580 和 11800 之间的 1 个边缘。

编辑#2:会话信息结果

R version 3.1.0 (2014-04-10)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United        States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

 other attached packages:
  [1] igraph_1.0.1

  loaded via a namespace (and not attached):
  [1] grid_3.1.0      lattice_0.20-29 magrittr_1.5    Matrix_1.1-3        tools_3.1.0    

\

编辑#3

Desired output
  3 x 3 sparse Matrix of class "dgCMatrix"
                17560 11800 13580
        17560     .     .     .
        11800     .     .     2
       13580     .     2     .


 11 x 11 sparse Matrix of class "dgCMatrix"
  [[ suppressing 11 column names ‘Emile ’, ‘Lou ’, ‘Luther ’ ... ]]

   Emile    . . . . . . . . . . .
   Lou      . . 1 1 1 . 1 1 1 . .
   Luther   . 1 . 1 1 . 1 1 1 . .
   Tot      . 1 1 . 1 . 1 1 1 . .
   Phineas  . 1 1 1 . 2 1 1 1 1
   Calvin   . 1 1 1 2 1 . 1 1 1 1
   Les      . 1 1 1 1 . 1 . 1 . .
   Jeff     . 1 1 1 1 . 1 1 . . .
   Sonny    . . . . . 1 1 . . . 1
   Leon     . . . . . 1 1 . . 1 .

【问题讨论】:

  • 这不是graph.data.frame(...) 的工作方式。试试plot(graph1)。这是你所期望的吗?
  • 是的,plot(graph1) 给了我预期的图表,在名称和rids 之间有正确的边。不确定为什么 graph.data.frame(...) 不起作用?

标签: r graph igraph bipartite


【解决方案1】:

我不知道你做了什么。可能需要更多信息:sessionInfo() 来检查您使用的是什么系统以及包的版本。

这是我在我的电脑中发现的(见下面 sessionInfo() 的结果

数据

data1 <- read.table(text="Name   rid
           Emile    17560
             Lou     11800
             Luther   11800
             Tot     11800
             Phineas   11800
             Phineas   13580
             Calvin    13580
             Calvin    11800
               Les      11800
              Jeff      11800
              Sonny     13580
               Leon      13580
               Red       13580", header=TRUE)

检查数据

head(data1)
dim(data1)
str(data1)
plot(data1)

调用库

library(igraph)

从 data1 创建图形对象

graph1 <- graph.data.frame(data1)

判断是否为二分

is.bipartite(graph1)        ### FALSE

转换为二分图

V(graph1)$type <- V(graph1)$name %in% data1[,1]

再次检查是否是二分的

is.bipartite(graph1)        ### TRUE

创建二分投影 多重性参数是假设计算边数

proj<-bipartite.projection(graph1, V(graph1)$type,multiplicity = TRUE)

从第一个投影中获取邻接矩阵

t1 <- get.adjacency(proj$proj1)
t1

加载所需的包:矩阵

“dgCMatrix”类的 11 x 11 稀疏矩阵

[[ 抑制 11 个列名 ‘Emile’, ‘Lou’, ‘Luther’ ... ]]

埃米尔。 . . . . . . . . . .

娄。 . 1 1 1 1 1 1 。 . .

路德。 1. 1 1 1 1 1 。 . .

托特。 1 1 . 1 1 1 1 。 . .

菲尼亚斯。 1 1 1 。 1 1 1 1 1 1

卡尔文。 1 1 1 1 。 1 1 1 1 1

莱斯。 1 1 1 1 1 。 1. . .

杰夫。 1 1 1 1 1 1 。 . . .

桑尼。 . . . 1 1 . . . 1 1

莱昂。 . . . 1 1 . . 1. 1

红色。 . . . 1 1 . . 1 1 .

从第二个投影中获取邻接矩阵

t2 <- get.adjacency(proj$proj2)
t2

“dgCMatrix”类的 3 x 3 稀疏矩阵

  17560 11800 13580

17560 。 . .

11800 。 . 1

13580 。 1.

绘制你的矩阵

g1 <- graph.adjacency(t1)

plot(g1)

sessionInfo() 的结果 R 版本 3.0.2 (2013-09-25) 平台:x86_64-w64-mingw32/x64(64位)

locale:
[1] LC_COLLATE=Italian_Italy.1252  LC_CTYPE=Italian_Italy.1252   
[3] LC_MONETARY=Italian_Italy.1252 LC_NUMERIC=C                  
[5] LC_TIME=Italian_Italy.1252    

attached base packages:[1] stats     graphics  grDevices utils        datasets  methods   base     
other attached packages: [1] Matrix_1.1-0 igraph_0.6.6
loaded via a namespace (and not attached): [1] grid_3.0.2      lattice_0.20-24

【讨论】:

  • 确实,我使用的是 R igraph 包(版本 1.0.0)(会话信息包含在 EDIT #2 中)。你得到和我一样的结果。我正在尝试获得“有价值的”投影矩阵。所以 3X3 矩阵看起来像上面编辑#3中的矩阵
  • 谁能看看我的问题:stackoverflow.com/questions/65243162/…谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2013-04-06
  • 2011-04-28
  • 2011-11-21
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多