2016-02-22 4 views
1

У меня возник вопрос о назначении значениям краев сети в R с использованием команды пакета network. Назначенные значения в моей большой сети просто не правы, поэтому я создал небольшую сеть, чтобы сделать проблему более легкой и воспроизводимой. Вот код для создания сети (включая значения, которые нужно назначить).Установить значения края с использованием сетевого пакета в 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, ae значение 2 и т. Д. Сеть заполняет правые края, то есть только те, которые существуют, но значения неверны. Мне кажется, что он использует значения в векторе 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