【发布时间】: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