plyr应用程序,创建一个矩阵列表,每个矩阵对应一个数据子集

时间:2011-02-25 00:29:43

标签: r social-networking plyr

在一些帮助下,我想出了如何将边缘列表(又称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

2 个答案:

答案 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)
}

EDIT2:

并将它们全部绘制在一个pdf文件中:

library(qgraph)
pdf("ADJplots.pdf")
l_ply(adjs,function(x)qgraph(x,labels=colnames(x)))
dev.off()