2014-07-10 4 views
1

Я хотел бы преобразовать некоторые реберные списки в матрицу смежности. Тем не менее, я сталкиваюсь с различными осложнениями. Мой набор данных состоит из 27 участников, которые могут или не могут иметь ничью (взвешенную между 1-5 и направленной) в течение 3 моментов времени.R: Как преобразовать взвешенные краевые списки в матрицу смежности?

Это означает, например, что для т = 1, у меня есть список края, как это:

countryA,countryB,tie 
AUH,GMY,2 
AUH,RUS,1 
AUH,UKG,4 
BOL,PER,5 
BRA,ARG,1 
PAR,UKG,4 

И т = 2, У меня есть список края, как это:

countryA,countryB,tie 
ARG,AUH,1 
AUH,UKG,4 
BOL,PER,5 
BRA,ARG,1 
PAR,UKG,4 
RUS,UKG,2 

Проблема в том, что для каждого периода я хотел бы иметь матрицу 27x27. Это означает, что также все актеры, которые не могут делиться ничьей с кем-либо еще, включаются на каждый период времени. В принципе, я хотел бы иметь что-то подобное для всех 3-х периодов (обратите внимание, что, в идеале, запятые ушли):

0 0 0 3 2 1 4 
0 0 4 2 1 0 0 
0 0 0 0 3 4 4 
0 0 0 0 2 1 4 
0 0 4 2 0 0 0 
0 0 0 0 3 0 4 
0 3 4 2 0 0 0 

Конечно, я уже проверил различные посты на форуме, помогают сайты и тому подобное. Но я не мог понять, как я должен это делать. Я расстроен.

ответ

1

Предположим, что у вас есть данные. Кадры хранятся в списке. Вот некоторые выборочные данные

t1<-structure(list(countryA = structure(c(1L, 1L, 1L, 2L, 3L, 4L), .Label = c("AUH", 
"BOL", "BRA", "PAR"), class = "factor"), countryB = structure(c(2L, 
4L, 5L, 3L, 1L, 5L), .Label = c("ARG", "GMY", "PER", "RUS", "UKG" 
), class = "factor"), tie = c(2L, 1L, 4L, 5L, 1L, 4L)), .Names = c("countryA", 
"countryB", "tie"), class = "data.frame", row.names = c(NA, -6L 
)) 
t2<-structure(list(countryA = structure(1:6, .Label = c("ARG", "AUH", 
"BOL", "BRA", "PAR", "RUS"), class = "factor"), countryB = structure(c(2L, 
4L, 3L, 1L, 4L, 4L), .Label = c("ARG", "AUH", "PER", "UKG"), class = "factor"), 
    tie = c(1L, 4L, 5L, 1L, 4L, 2L)), .Names = c("countryA", 
"countryB", "tie"), class = "data.frame", row.names = c(NA, -6L 
)) 

tt<-list(t1=t1, t2=t2) 

Во-первых, вы хотите, чтобы получить список всех уникальных названий стран

countries <- sort(unique(unlist(sapply(tt, function(x) sapply(x[,1:2], levels))))) 

Теперь вы хотите, чтобы убедиться, что все ваши data.frames использовать одни и те же уровни фактора для колонны страны. Мы можем сделать это с

ttx <- lapply(tt, function(x) {x[,1:2]<-lapply(x[,1:2], factor, levels= countries); x}) 

Теперь, когда все они в курсе всех стран, мы можем использовать xtabs создать матрицу смежности с взвешенным галстука значения

lapply(ttx, function(x) xtabs(tie~countryA+countryB, x)) 

, что приводит к

$t1 
     countryB 
countryA ARG AUH BOL BRA GMY PAR PER RUS UKG 
    ARG 0 0 0 0 0 0 0 0 0 
    AUH 0 0 0 0 2 0 0 1 4 
    BOL 0 0 0 0 0 0 5 0 0 
    BRA 1 0 0 0 0 0 0 0 0 
    GMY 0 0 0 0 0 0 0 0 0 
    PAR 0 0 0 0 0 0 0 0 4 
    PER 0 0 0 0 0 0 0 0 0 
    RUS 0 0 0 0 0 0 0 0 0 
    UKG 0 0 0 0 0 0 0 0 0 

$t2 
     countryB 
countryA ARG AUH BOL BRA GMY PAR PER RUS UKG 
    ARG 0 1 0 0 0 0 0 0 0 
    AUH 0 0 0 0 0 0 0 0 4 
    BOL 0 0 0 0 0 0 5 0 0 
    BRA 1 0 0 0 0 0 0 0 0 
    GMY 0 0 0 0 0 0 0 0 0 
    PAR 0 0 0 0 0 0 0 0 4 
    PER 0 0 0 0 0 0 0 0 0 
    RUS 0 0 0 0 0 0 0 0 2 
    UKG 0 0 0 0 0 0 0 0 0 

, который вы можете делать с тем, что вам нравится. Просто важно, чтобы все они использовали одинаковые уровни факторов, чтобы получить таблицы с одинаковыми размерами, даже если некоторые наблюдения отсутствуют.

+0

Спасибо! Я хотел ответить в этом поле «комментарий», но мой комментарий был слишком длинным, поэтому я ответил в теме. – farbetjan

+0

Хорошо, мой «ответ» был удален. Но на самом деле я не ввел его в качестве факторов. Тем не менее, даже если вы используете свой код 'ttx <- lapply (tt, function (x) {x [, 1: 2] <- lapply (x [, 1: 2], factor, levels = groups); x}) 'не работал. Он выдает ошибку «Ошибка в FUN (X [[1L]], ...): группы объектов« не найдены ». С наилучшими пожеланиями! – farbetjan

+0

@farbetjan Я вижу. Да. Я изменил имя переменной в одном месте, а не другое. Я исправил код выше. Извини за это. – MrFlick

Смежные вопросы