在一些帮助下,我想出了如何将边缘列表(又称adjacency list)转换为adjacency matrix.我想学习如何为大量边缘列表自动执行此操作,然后将结果放入列表中的邻接矩阵。
我猜plyr是最好的方法,但如果你想告诉我如何用循环做这件事,我也会感激不尽。对于好奇的人来说,数据代表了不同学校的社交网络。
这是我到目前为止所得到的:
# extract one school edgelist from the dataframe
aSchool <- myDF[which(myDF$school==1), c("school", "id", "x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")]
# figure out unique ids
edgeColumns <- c("x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
ids <- unique(unlist(aSchool[edgeColumns]))
ids <- ids[!is.na(ids)]
# make an empty matrix
m <- matrix(0,nrow=length(ids),ncol=length(ids))
rownames(m) <- colnames(m) <- as.character(ids)
# fill in the matrix
for(col in edgeColumns){
theseEdges <- aSchool[c("id",col)]
theseEdges <- na.omit(theseEdges)
theseEdges <- apply(theseEdges,1,as.character)
theseEdges <- t(theseEdges)
m[theseEdges] <- m[theseEdges] + 1
}
for(i in 1:nrow(m)) m[i,i] <- 0
答案 0 :(得分:2)
查看SNA package以及as.edgelist.sna()
和as.sociomatrix.sna()
功能。
特别是,as.sociomatrix.sna()
似乎是一个完美的解决方案:它设计用于在一个步骤中将边缘列表转换为邻接矩阵(不会丢失诸如顶点名称等属性)。在致电lapply()
时将其全部包裹起来,我认为你已经拥有了另一个(可能是劳动密集程度较低的?)解决方案。
如果您希望看到更具表现力的答案,我认为提供更完整的样本数据或更准确地描述myDF
此外,我没有 SO 的声誉,但我会在这篇文章中添加一些标签来表示它是关于网络分析的。
答案 1 :(得分:1)
如果没有可行的例子,很难回答你的问题。但是,如果我正确理解你的问题,这里的函数应该有效(返回包含对称邻接矩阵的列表):
makeADJs <- function(...)
{
require(plyr)
dfs <- list(...)
e2adj <- function(x)
{
IDs <- unique(c(as.matrix(x)))
df <- apply(x,2,match,IDs)
adj <- matrix(0,length(IDs),length(IDs))
colnames(adj) <- rownames(adj) <- IDs
a_ply(rbind(df,df[,2:1]),1,function(y){adj[y[1],y[2]] <<- 1})
return(adj)
}
llply(dfs,e2adj)
}
示例:
makeADJs(
cbind(letters[sample(1:26)],letters[sample(1:26)]),
cbind(letters[sample(1:26)],letters[sample(1:26)]),
cbind(letters[sample(1:26)],letters[sample(1:26)]),
cbind(letters[sample(1:26)],letters[sample(1:26)])
)
或没有plyr
:
makeADJs <- function(...)
{
dfs <- list(...)
e2adj <- function(x)
{
IDs <- unique(c(as.matrix(x)))
df <- apply(x,2,match,IDs)
adj <- matrix(0,length(IDs),length(IDs))
colnames(adj) <- rownames(adj) <- IDs
apply(rbind(df,df[,2:1]),1,function(y){adj[y[1],y[2]] <<- 1})
return(adj)
}
lapply(dfs,e2adj)
}
并将它们全部绘制在一个pdf文件中:
library(qgraph)
pdf("ADJplots.pdf")
l_ply(adjs,function(x)qgraph(x,labels=colnames(x)))
dev.off()