make循环在R中创建igraph对象列表

时间:2011-07-27 00:13:42

标签: r social-networking igraph

我想创建一个Igraph对象列表,其中包含用于由另一个变量确定的每个Igraph对象的数据。

这就是我创建单个Igraph对象的方法

netEdges <- NULL

for (idi in c("nom1", "nom2", "nom3")) {
        netEdge <- net[c("id", idi)]
        names(netEdge) <- c("id", "friendID")
        netEdge$weight <- 1
        netEdges <- rbind(netEdges, netEdge)
    }

g <- graph.data.frame(netEdges, directed=TRUE)

对于net$community的每个唯一值,我想创建一个新的Igraph对象。然后我想计算每个对象的中心度量,然后将这些度量反馈到我的net数据集中。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

由于您提供的代码不能完全重现,因此无法保证以下内容的运行。它旨在作为如何构建真实解决方案的指南。如果您提供其他人可用于运行代码的示例数据,您将获得更好的答案。

执行此操作的最简单方法可能是将net拆分为一个列表,其中每个唯一值community都有一个元素,然后将图形构建代码应用于每个部分,并为每个部分存储结果在另一个清单中。在R中有几种方法可以做这种事情,其中​​一种方法是使用lapply

#Break net into pieces based on unique values of community
netSplit <- split(net,net$community)

#Define a function to apply to each element of netSplit
myFun <- function(dataPiece){
    netEdges <- NULL

    for (idi in c("nom1", "nom2", "nom3")) {
        netEdge <- dataPiece[c("id", idi)]
        names(netEdge) <- c("id", "friendID")
        netEdge$weight <- 1
        netEdges <- rbind(netEdges, netEdge)
    }

    g <- graph.data.frame(netEdges, directed=TRUE)
    #This will return the graph itself; you could change the function
    # to return other values calculated on the graph
    g
}

#Apply your function to each subset (piece) of your data:
result <- lapply(netSplit,FUN = myFun)

如果一切顺利,result应该是一个列表,其中包含myFun的每个唯一值的图表(或您要修改的任何内容community)。其他用于执行类似任务的常用工具包括ddply包中的plyr