小编R. *_*Zhu的帖子

迭代顶点并根据邻居的属性计算新属性的快速方法

我正在做一个简单的任务:迭代所有顶点并根据其邻居的属性计算新属性。我搜索了 SO,到目前为止我知道至少有三种方法可以做到这一点:

  1. 使用 ad_adj_list 创建一个 adj 列表,然后迭代每个元素;
  2. 使用 sapply 直接迭代每个顶点。

然而,对于我的数据量(30 万个顶点和 800 万条边)来说,这两种方法都花费太长的时间。有没有快速循环顶点的方法?谢谢!

对于基准测试,假设我有以下示例数据:

set.seed <- 42
g <- sample_gnp(10000, 0.1)
V(g)$name <- seq_len(gorder(g)) # add a name attribute for data.table merge
V(g)$attr <- rnorm(gorder(g))
V(g)$mean <- 0 # "mean" is the attribute I want to compute
Run Code Online (Sandbox Code Playgroud)

方法1的代码是:

al <- as_adj_list(g)
attr <- V(g)$attr
V(g)$mean <- sapply(al, function(x) mean(attr[x])) 
# took 28s
# most of the time is spent on creating the adj list
Run Code Online (Sandbox Code Playgroud)

方法2的代码是:

compute_mean <- function(v){
    mean(neighbors(g, …
Run Code Online (Sandbox Code Playgroud)

r igraph sna

5
推荐指数
1
解决办法
1086
查看次数

展开data.tables的列表列

我有一个data.table列表列,其中每个元素是data.table:

dt <- data.table(id = c(1, 1, 2),
                 var = list(data.table(a = c(1, 2), b = c(3, 4)),
                            data.table(a = c(5, 6), b = c(7, 8)),
                            data.table(a = 9, b = 10)))

dt
# id             var
# 1:  1 <data.table>
# 2:  1 <data.table>
# 3:  2 <data.table>
Run Code Online (Sandbox Code Playgroud)

现在我想将这个结构"取消列出":

   a  b id
1: 1  3  1
2: 2  4  1
3: 5  7  1
4: 6  8  1
5: 9 10  2
Run Code Online (Sandbox Code Playgroud)

我知道如何扩展嵌入式data.table部分rbindlist …

r data.table

4
推荐指数
1
解决办法
534
查看次数

标签 统计

r ×2

data.table ×1

igraph ×1

sna ×1