2014-12-01 2 views
0

Мне было интересно, если вы, ребята, можете помочь мне построить матрицу смежности. У меня есть данные в формате CVS, как это:Матрица здания и смежности

Paper_ID Author 
2 Foster-McGregor, N. 
3 Van Houte, M. 
4 van de Meerendonk, A. 
5 Farla, K. 
6 van Houte, M. 
6 Siegel, M. 
8 Farla, K. 
11 Farla, K. 
11 Verspagen, B. 

Как вы можете увидеть в столбце «Paper_ID» имеет повторяющееся значение 11, а это означает, что «Фарла, К.» и "Verspagen, B." являются соавторами публикации. Мне нужно построить квадратную взвешенную матрицу, используя имена авторов, считая время совместной совместной работы.

ответ

1

Выполняет ли нижеследующие действия то, что вы ищете?

# simulate data. 
d <- data.frame(
    id=c(2,3,4,5,6,6,8,11,11,12,12), 
    author=c("FN", "VM","VA","FK","VM","SM","FK","FK","VB","FK","VB") 
) 

d 
    id author 
1 2  FN 
2 3  VM 
3 4  VA 
4 5  FK 
5 6  VM 
6 6  SM 
7 8  FK 
8 11  FK 
9 11  VB 
10 12  FK 
11 12  VB 

# create incidence matrix: 
m <- xtabs(~author+id,d) 
m 
     id 
author 2 3 4 5 6 8 11 12 
    FK 0 0 0 1 0 1 1 1 
    FN 1 0 0 0 0 0 0 0 
    SM 0 0 0 0 1 0 0 0 
    VA 0 0 1 0 0 0 0 0 
    VB 0 0 0 0 0 0 1 1 
    VM 0 1 0 0 1 0 0 0 

# convert to adjacency matrix. 
# tcrossprod does "m %*% t(m)" 
tcrossprod(m) 
     author 
author FK FN SM VA VB VM 
    FK 4 0 0 0 2 0 
    FN 0 1 0 0 0 0 
    SM 0 0 1 0 0 1 
    VA 0 0 0 1 0 0 
    VB 2 0 0 0 2 0 
    VM 0 0 1 0 0 2 

Обратите внимание, что crossprod() даст вам матрицу инцидентности для переменной id (т.е. будет делать t(m) %*% m).

+0

Спасибо, это было очень полезно. –

+0

Уважаемый ddiez, у меня возникли проблемы с командой crossprod. Я запускаю набор данных, аналогичный тому, который вы предложили: d <- data.frame (id = c (2,3,4,5,6,6,8,11,11,11,12,12,12) , автор = с ("FN", "В.", "В.", "ФК", "В.", "СМ", "ФК", "ФК", "ВБ", "В.", "ФК",» VB "," VA ")) –

+0

Что случилось с проблемой? У меня нет этих данных, которые вы показываете. – ddiez