【发布时间】:2017-12-26 19:57:22
【问题描述】:
我有一个大型方阵,其中包含每行或每列之间的相关性:
mat <- matrix(rnorm(5000 * 5000), nrow = 5000, dimnames = list(
paste0("ID", seq_len(5000)), paste0("ID", seq_len(5000))))
我想从这个矩阵中提取前 100,000 个唯一对(即 ID1-ID2 与 ID2-ID1 相同),然后将它们转换为数据框。目前,我正在使用此代码:
corDat <- reshape2::melt(mat, varnames = c("id.A", "id.B"),
value.name = "value", na.rm = T)
corDat <- corDat[as.character(corDat$id.A) < as.character(corDat$id.B),]
corDat <- corDat[order(-corDat$value),]
top_n <- 100000
corDat <- corDat[seq_len(top_n),]
结果:
head(corDat)
id.A id.B value
19316931 ID1931 ID3864 5.658092
14312231 ID2231 ID2863 5.416562
3225529 ID529 ID646 5.357433
3492653 ID2653 ID699 5.297154
17046659 ID1659 ID3410 5.105343
3323364 ID3364 ID665 4.987266
...
但是,由于矩阵很大,上面的前两个操作(melt矩阵和删除重复对)需要很长时间,通常超过 5 分钟。我需要将此操作应用于数百个可变大小的方阵(通常大于 5000x5000)。
我确信必须有一种更快的方法来提取这些信息,因为我实际上不需要融合整个矩阵——只需要与前 100,000 个值关联的行和列名。如何更有效地完成此操作?
【问题讨论】:
-
当你说“top 100,000 unique pairs”时,你是指矩阵
mat的上三角吗?
标签: r matrix optimization