假设我有以下示例数据,其中包含大约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))
返回我没有邻接矩阵的错误。
最有效的方法是什么?
答案 0 :(得分:0)
使用which
函数,该函数将为您显示邻接矩阵中的非零元素
喜欢:
which(ad.matrix != 0)