【问题标题】:Create edgelist from adjacency matrix in a massive dataset从海量数据集中的邻接矩阵创建边缘列表
【发布时间】:2018-07-28 00:41:13
【问题描述】:

假设我有以下包含大约 200 万行的示例数据:

dt <- data.table(event_id=as.character(rep(letters[1:26],80000)),person_id=as.character(rep(letters[1:26],80000)), organizer_id = as.character(rep(letters[1:26],800000)))

实际上,唯一的 event_ids、person_ids 和 Organizer_ids 比 26 多得多。我像这样构造邻接 df:

adjacency_df <- dt %>%
  select('event_id', 'person_id', 'organizer_id') %>%
  melt('event_id', value.name = 'person_id') %>%
  dcast(person_id~person_id, fun.aggregate = n_distinct, value.var = 'event_id')

接下来,我尝试从 adjacency_df 转到边缘列表。但是,我想不出一种可以很好地扩展的方法。

这段代码

adjacency_matrix <- crossprod(table(rep(dt$event_id, 2), unlist(dt[, c('event_id', 'person_id')])))

返回错误

Error in table - attempt to make a table with >= 2^31 elements

此代码在真实数据集上挂起超过 30 分钟,实际上并没有在上面的示例数据集上生成干净的边缘列表。

edge_df_2 <- data.frame(name = paste(rownames(adjacency_df)[col(adjacency_df)], colnames(adjacency_df)[row(adjacency_df)], sep="-"),
          val = c(t(adjacency_df)), stringsAsFactors = FALSE)

使用库(wNetwork)并做:

edge <- adjacency.to.edgelist(as.matrix(adjacency_df))

返回我没有邻接矩阵的错误。

最有效的方法是什么?

【问题讨论】:

    标签: r network-programming


    【解决方案1】:

    使用which 函数,该函数将为您提供邻接矩阵中非零元素的指示 喜欢:

    which(ad.matrix != 0)
    

    【讨论】:

    • 我不知道从那里去哪里。
    • 抱歉,回答迟了。如果您有一个二进制邻接矩阵 a.mat,which(a.mat == 1, arr.ind = TRUE) 将为您提供非零元素的索引。所以基本上是一个链接列表。不确定这是您要查找的内容,只是一个建议。
    • 让我试试。我一直在寻找链接列表
    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多