2016-02-22 28 views
1

我有一個關於使用network包的set.edge.value命令將邊緣值分配給R網絡的問題。在我的大型網絡中分配的值是不正確的,因此我生成了一個小型網絡,使問題更易於查看和重現。以下是生成網絡的代碼(包括要分配的值)。使用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 

但是,這些顯然是錯誤的值,可以在邊界列表形式(加上c,值)下面看到。因此,邊緣ab應具有值1,ae2等。網絡填充右邊緣,即只有確實存在的邊緣,但值是錯誤的。在我看來,它使用向量c中的值並嘗試填充從aa開始,然後是ab等(即它按行填充網絡)的每個邊緣,但只填充現有邊緣。當數據用完時,使用回收規則重新開始。有沒有人有一個想法如何填補適當的價值觀的邊緣?我已經嘗試了一段時間,但我似乎無法弄清楚,Google也沒有太多幫助(或者我正在尋找錯誤的東西)。任何幫助,將不勝感激!謝謝!

> 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 

回答

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