R:如何将加权边列表转换为邻接矩阵?

时间:2014-07-10 12:34:29

标签: r matrix rstudio network-analysis

我想将一些边缘列表转换为邻接矩阵。然而,我面临着各种各样的复杂情况:我的数据集由27位演员组成,他们在3个时刻内可能有或没有平局(加权1-5和指导)。

这意味着,例如,对于 t = 1 ,我有一个像这样的边缘列表:

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

对于 t = 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 个答案:

答案 0 :(得分:1)

假设您将data.frame存储在列表中。这是一些示例数据

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

然后你可以做任何你喜欢的事情。即使缺少一些观察结果,使用相同的因子水平来获得具有相同尺寸的表格也是非常重要的。