我有一个相当大的数据集(大约50K个条目),我用它来生成关联矩阵.这很好用,只使用了20 GB左右的内存.

然后,我只想从其中提取唯一的成对组合,并将其转换为数据框.这就是我遇到问题的地方.内存使用率过高或索引变量溢出(S).我知道有>2B组合,所以我知道它的大小有点爆炸,但仍然..

我try 了不同的方法来实现这一点,但都没有成功.

模拟数据:

df = matrix(runif(1),nrow=50000, ncol=50000, dimnames=list(seq(1,50000,by=1), seq(1,50000,by=1)))

try 从相关矩阵中提取上/下三角形,然后对其进行reshape :

df[lower.tri(df, diag = T),] = NA
df = reshape2::melt(df, na.rm = T)

崩溃的原因:

Error in df[lower.tri(bla, diag = T), ] = NA : 
  long vectors not supported yet: ../../src/include/Rinlinedfuns.h:522

如果您只执行以下操作,它将崩溃,并返回相同的错误:df = df[lower.tri(df, diag = T),] (我确实读了Large Matrices in R: long vectors not supported yet遍,但我觉得它对我的情况没有帮助)

我还试过:

df = subset(as.data.frame(as.table(df)),
       match(Var1, names(annotation_table)) > match(Var2, names(annotation_table)))

仅使用基于R的包,但它最终在大约1天后耗尽内存.这是内存占用最大的部分:as.data.frame(as.table(df)),所以我也try 用reshape2::melt(df)替换它,但内存也用完了

我在一台内存为128 GB的Ubuntu机器上运行代码.我确实有更大的机器,但我预计这个内存量应该足够了.

任何帮助都将不胜感激.谢谢.

推荐答案

如果你有如你所说的那样多的内存,那么对于比6大得多的n来说,这真的应该是没有问题的.

set.seed(0)
n <- 6L
x <- provideDimnames(cor(matrix(rnorm(as.double(n) * n), n, n)))
x
            A           B            C           D           E            F
A  1.00000000  0.42679900  0.113100027 -0.03952030 -0.02406114 -0.693427730
B  0.42679900  1.00000000  0.519377903  0.06136646 -0.51713799 -0.331961466
C  0.11310003  0.51937790  1.000000000 -0.43996491 -0.32225557 -0.006199606
D -0.03952030  0.06136646 -0.439964909  1.00000000 -0.42053358  0.537301520
E -0.02406114 -0.51713799 -0.322255571 -0.42053358  1.00000000 -0.367595700
F -0.69342773 -0.33196147 -0.006199606  0.53730152 -0.36759570  1.000000000
s <- seq_len(n) - 1L
nms <- dimnames(x)
dat <- data.frame(val = x[sequence(s, seq.int(1L, length(x), n))],
                  row = gl(n, 1L, labels = nms[[1L]])[sequence(s, 1L)], 
                  col = rep.int(gl(n, 1L, labels = nms[[2L]]), s))
dat
            val row col
1   0.426798998   A   B
2   0.113100027   A   C
3   0.519377903   B   C
4  -0.039520302   A   D
5   0.061366463   B   D
6  -0.439964909   C   D
7  -0.024061141   A   E
8  -0.517137993   B   E
9  -0.322255571   C   E
10 -0.420533577   D   E
11 -0.693427730   A   F
12 -0.331961466   B   F
13 -0.006199606   C   F
14  0.537301520   D   F
15 -0.367595700   E   F

如果您使用的R版本早于4.0.0,其中sequence的定义不同,那么您将需要类似于:

sequence <- function(nvec, from = 1L, by = 1L)
    unlist(.mapply(seq.int, list(from = from, by = by, length.out = nvec), NULL),
           recursive = FALSE, use.names = FALSE)

请注意,seq.int同时接受integerdouble参数,如果确定结果将溢出integer,则可以方便地返回double而不是integer,这在本例中为n * n > .Machine$integer.max.

M <- .Machine$integer.max
typeof(seq.int(from = 1L, to = 1 + M, by = M))
[1] "double"

R相关问答推荐

如何在热图中绘制一个图形,但在每个单元格中通过饼形图显示?

R中的枢轴/转置

整数成随机顺序与约束R?

如何优化向量的以下条件赋值?

使用rvest从多个页面抓取时避免404错误

将重复项转换为NA

从圆到R中的多边形的标绘雷达图

用R ggplot2求上、下三角形中两个变量的矩阵热图

将标识符赋给事件序列,避免错误观察

如果COLSUM为>;0,则COLNAME为向量

提高圣彼得堡模拟的速度

如何对r中包含特定(未知)文本的行求和?

用多边形替换地块点

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

在REST API中使用参数R

将边列表转换为路径长度列表

如何编辑被动式数据表?

Ggplot2:添加更多特定 colored颜色 的线条

如何在R中添加标识连续日期的新列

如何计算多个变量的百分比与总和的百分比?