R内存问题中的笛卡尔积

问题描述

我希望得到跨向量的元素的所有可能组合。这些问题说明了我在 Python (Get the cartesian product of a series of lists?) 和 R (Cartesian product data frame) 中尝试做的事情。

但是,按照 R 中后者的回答 (https://stackoverflow.com/a/4309350/9096420),我遇到了内存问题(即,无法分配大小为 86792.1 Gb 的向量R memory management / cannot allocate vector of size n Mb) .我已经尝试了其中的一些答案,但我的矢量大小似乎太大而无法克服。

这让我觉得我处理这个问题的方式有问题。有很多可能的组合,但这似乎是可以解决的。

我的数据:

    dat<-structure(list(rows = c(62L,63L,64L,65L,68L,69L,70L,NA,NA),rows.1 = c(119L,120L,122L,123L,124L,125L,rows.2 = c(137L,138L,139L,140L,141L,142L,143L,144L,145L,rows.3 = c(161L,162L,163L,164L,165L,166L,167L,rows.4 = c(168L,169L,170L,rows.5 = c(148L,149L,150L,151L,152L,153L,154L,155L,156L,rows.6 = c(135L,136L,rows.7 = c(108L,109L,110L,rows.8 = c(116L,117L,118L,121L,rows.9 = c(178L,180L,181L,182L,183L,rows.10 = c(179L,184L,185L,186L,187L,188L,189L,190L,191L,192L,193L,194L,195L),rows.11 = c(50L,51L,52L,NA)),class = "data.frame",row.names = c(NA,-13L))

dat
   rows rows.1 rows.2 rows.3 rows.4 rows.5 rows.6 rows.7 rows.8 rows.9 rows.10 rows.11
1    62    119    137    161    168    148    135    108    116    178     179      50
2    63    120    138    162    169    149    136    109    117    180     184      51
3    64    122    139    163    170    150     NA    110    118    181     185      52
4    65    123    140    164     NA    151     NA     NA    121    182     186      NA
5    68    124    141    165     NA    152     NA     NA     NA    183     187      NA
6    69    125    142    166     NA    153     NA     NA     NA     NA     188      NA
7    70     NA    143    167     NA    154     NA     NA     NA     NA     189      NA
8    NA     NA    144     NA     NA    155     NA     NA     NA     NA     190      NA
9    NA     NA    145     NA     NA    156     NA     NA     NA     NA     191      NA
10   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     192      NA
11   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     193      NA
12   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     194      NA
13   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     195      NA

我的目标是将每一列中的一个值与其他列中所有可能的值组合相结合(每列只允许一个值)。只有两列有效的小例子:

expand.grid(dat[,1],dat[,2])
    Var1 Var2
1     62  119
2     63  119
3     64  119
4     65  119
5     68  119
6     69  119
7     70  119
8     NA  119
9     NA  119
10    NA  119
11    NA  119
12    NA  119
13    NA  119
14    62  120
15    63  120
16    64  120
17    65  120
18    68  120
19    69  120
20    70  120
21    NA  120
22    NA  120
23    NA  120
24    NA  120
25    NA  120
26    NA  120
27    62  122
28    63  122
# ... output truncated

当我尝试对整个数据集执行此操作时,出现内存问题:

要么

expand.grid(dat)

expand.grid(dat[,2],3],4],5],6],7],8],9],10],11],12])

(我认为是相同的),两者都会产生错误

Error: cannot allocate vector of size 86792.1 Gb

有没有更简单的方法解决内存问题?我在这里做错了什么?


这是使用嵌套 for 循环执行此操作的另一种方法(但它非常麻烦,因为它需要为每一列数据使用 for 循环:

output<-NULL

for(h in 1:13){
  for(i in 1:13){
    for(j in 1:13){
output<-rbind(output,c(dat[h,dat[i,dat[j,3])
)
    }}}

output
        [,1] [,2] [,3]
   [1,]   62  119  137
   [2,]   62  119  138
   [3,]   62  119  139
   [4,]   62  119  140
   [5,]   62  119  141
   [6,]   62  119  142
   [7,]   62  119  143
   [8,]   62  119  144
   [9,]   62  119  145
  [10,]   62  119   NA
  [11,]   62  119   NA
  [12,]   62  119   NA
  [13,]   62  119   NA
  [14,]   62  120  137
  [15,]   62  120  138
  [16,]   62  120  139
  [17,]   62  120  140
  [18,]   62  120  141
  [19,]   62  120  142
  [20,]   62  120  143
  [21,]   62  120  144
  [22,]   62  120  145
  # ... output truncated

如果我想对每个组合都这样做,它看起来像:

for(h in 1:13){
  for(i in 1:13){
    for(j in 1:13){
      for(k in 1:13){
        for(l in 1:13){
          for(m in 1:13){
            for(n in 1:13){
              for(o in 1:13){
                for(p in 1:13){
                  for(q in 1:13){
                    for(r in 1:13){
                      for(s in 1:13){
output<-rbind(output,dat[k,dat[l,dat[m,dat[n,dat[o,dat[p,dat[q,dat[r,dat[s,12])
)
    }}}}}}}}}}}}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...