1

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

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应该有 value 1aevalue2等。网络填充右边的边,即只填充那些确实存在的边,但值是错误的。在我看来,它使用向量中的值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
4

1 回答 1

0

好的,我想通了。我不得不使用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
于 2016-02-22T13:59:35.953 回答