快速汇总R中大图中相邻属性的方法 [英] FAST way to sum up neighbors' attributes in a large graph in R

查看:18
本文介绍了快速汇总R中大图中相邻属性的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个大的图形对象,几乎有1M个节点和1.5M个边。在研究了一段时间后,我找不到一个程序来对节点的邻居属性进行求和,在本例中,它是一个二进制属性。目前,我找到的最佳解决方案如下:

V(g)$sum = sapply( ego(g,1,V(g),mode = 'all',mindist = 1), function(v) sum(V(G)[v]$attr) )

然而,12小时后,它仍然发出嘎吱嘎吱的声音。

有什么建议吗?

更新1:让我们看一下下图

library(igraph)
G <- graph.formula(1-+2,1-+3,2-+4,2-+5,3-+6,5-+7,7-+8,8-+9,9+-7, 9-+10,
               6-+9,1-+5,3-+9,10-+11,11-+12,11-+5,12-+4,4-+10,10-+4,11-+10)
V(G)$attr = c(1,1,0,0,1,0,1,0,1,0,1,0)
plot(G, vertex.label.color = "white",  edge.width=E(G)$weight, layout = layout.circle(G))

并且预期的结果应该是...

 sapply( ego(G,1,V(G),mode = 'all',mindist = 1), function(v) sum(V(G)[v]$attr) )
 [1] 2 2 2 1 4 1 2 2 1 2 1 1
@Tamás,我尝试在不使用循环的情况下访问Neighbors函数,但得到的结果不是上面描述的结果...

sapply(neighbors(G,V(G)),function (v) sum(V(G)[v]$attr))
2 3 5 
1 0 1 

推荐答案

我也在大型网络中工作,我遇到了一些问题,因为igraph执行"简单"任务所需的时间很长,例如计算betweennesscloseness。然而,就您的情况而言,我认为您可以在网络框架之外解决此问题。

首先,将您的网络转换为data.frame并使用库data.table,这对于处理大数据集来计算属性总和非常快。

library(igraph)
library(magrittr)
library(data.table)

# simple network
  g<- graph.formula(1-+2,1-+3,2-+4,2-+5,3-+6,5-+7,7-+8,8-+9,9+-7, 9-+10,
                     6-+9,1-+5,3-+9,10-+11,11-+12,11-+5,12-+4,4-+10,10-+4,11-+10)

  V(g)$attr = c(1,1,0,0,1,0,1,0,1,0,1,0)


# convert the network to data.table
  dt <- as_long_data_frame(g) %>% setDT()

# Calculate the sum of neighbors' attributes by origin (from). This is really fast in data.table
  mysum <- dt[, .(attr_sum = sum(to_attr)), by= from]

# get the sum result back in the data doing a simple merge
  dt <- dt[mysum, on=.(from)] 

# get the sum into the network object
  E(g)$attr_sum <- dt$attr_sum

这篇关于快速汇总R中大图中相邻属性的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆