问题描述
我希望得到跨向量的元素的所有可能组合。这些问题说明了我在 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 (将#修改为@)