【问题标题】:Set edge values using network package in R使用 R 中的网络包设置边缘值
【发布时间】:2016-06-03 19:52:10
【问题描述】:

我有一个关于使用network 包的set.edge.value 命令将边缘值分配给R 中的网络的问题。我的大型网络中的分配值不正确,因此我生成了一个小型网络以使问题更容易可见和可重现。这是生成网络的代码(包括要分配的值)。

a <- c(rep("a",3), "b", "c", rep("d",3), rep("f",2), "g")
b <- c("c", "e", "f", "a", "g", "a", "e", "f", "b", "e", "c")
c <- 1:11
d <- data.frame(a,b,c)
mat <- network(d[,c(1,2)], directed=T, attrname="val")
set.edge.value(mat, "val", c)
mat2 <- as.matrix.network(mat, attrname="val")

网络现在如下所示。

> mat2
  a b  c d  e f g
a 0 0  4 0  7 3 0
b 2 0  0 0  0 0 0
c 0 0  0 0  0 0 1
d 4 0  0 0 10 6 0
e 0 0  0 0  0 0 0
f 0 2  0 0  1 0 0
g 0 0 10 0  0 0 0

但是,这些显然是错误的值,如下面的 edgelist 形式所示(加上 c,值)。所以边缘ab 应该有值1ae2 等等。网络填充右边缘,即只有那些确实存在但值错误的边缘。在我看来,它使用向量c 中的值并尝试填充从aa 开始的每条边,然后是ab 等(即它逐行填充网络),但只填充现有边.当它用完值时,它会使用回收规则重新开始。有谁知道如何用适当的值填充边缘?我已经尝试了一段时间,但我似乎无法弄清楚,谷歌也没有太多帮助(或者我正在寻找错误的东西)。任何帮助,将不胜感激!谢谢!

> d
   a b  c
1  a c  1
2  a e  2
3  a f  3
4  b a  4
5  c g  5
6  d a  6
7  d e  7
8  d f  8
9  f b  9
10 f e 10
11 g c 11

【问题讨论】:

    标签: r social-networking sna


    【解决方案1】:

    好的,我想通了。我必须使用set.edge.attribute 而不是set.edge.value 如下(使用来自上述问题的数据)。

    mat1 <- network(d[,c(1,2)], directed=T)
    set.edge.attribute(mat1,'val',c)
    mat2 <- as.sociomatrix(mat1,matrix.type='adjacency',attrname='val')
    

    这给出了以下矩阵(正是我想要的):

    > mat2
       a b  c d  e f g
     a 0 0  1 0  2 3 0
     b 4 0  0 0  0 0 0
     c 0 0  0 0  0 0 5
     d 6 0  0 0  7 8 0
     e 0 0  0 0  0 0 0
     f 0 9  0 0 10 0 0
     g 0 0 11 0  0 0 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多