从大量数据集中的邻接矩阵创建边列表

时间:2018-07-27 15:01:09

标签: r network-programming

假设我有以下示例数据,其中包含大约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)))

实际上,与26相比,唯一的event_ids,person_ids和Organizer_ids要多得多。我这样构造邻接关系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))

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

最有效的方法是什么?

1 个答案:

答案 0 :(得分:0)

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

which(ad.matrix != 0)