使用约束扩展网格(或电源集)
Posted
技术标签:
【中文标题】使用约束扩展网格(或电源集)【英文标题】:Expand grid (or power set) with constraints 【发布时间】:2018-05-26 00:35:50 【问题描述】:这个问题可能太笼统了,但我觉得它在我的工作中一次又一次地出现,因此可能会引起其他人的兴趣。
假设我想创建一个基于扩展网格的数据表(或矩阵)。
library(data.table)
Vmat1 = data.table(expand.grid(c(list(d = 1:5, w = 1:(3)))))
但是,假设如果我这样做,这将导致真实功率集的内存错误。但是,我想施加一些限制,例如:
如果w>1,那么它一定是d
这会给出较小的最终集,不会导致内存错误:
Vmat1[w>1 & d<3 | w==1]
d w
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
6: 1 2
7: 2 2
8: 1 3
9: 2 3
我的问题是,是否可以在创建网格时预先施加限制?构建完整的电源组然后调节和减少的成本太高。
【问题讨论】:
为 expand.grid 拆分成组? ***.com/q/50400696/3358272 的可能重复项。 (实际上是一回事……懒惰地扩展网格,例如 python2 的xrange
),带有约束。)
【参考方案1】:
如果你关心的是记忆,你可以按照@chinsoon 的建议分成几组。
# Filter Method
V = CJ(d = 1:5, w = 1:3) # same as data.table(expand.grid(c(list(d = 1:5, w = 1:(3))))) except ordering
a <- V[w>1 & d<3 | w==1]
# Sets Method
d <- 1:5
w <- 1:3
b <- rbindlist(list(
CJ(d = d[d < 3], w = w[w > 1])
, CJ(d = d, w = w[w == 1])))
all(a == b[order(d, w)])
# [1] TRUE
【讨论】:
如果您有一个将列相互关联的条件怎么办?例如,另外假设,最后必须始终为真,d+w CJ 也可以与列表一起使用吗?假设我有一个列表,其中包含 d 和 w 的可能向量作为单独的元素。如果我有很多变量或不想对其进行硬编码,这很有用 您可以使用do.call(CJ, listname)
将列表元素作为参数传递给CJ
(或其他函数)。对于更复杂的约束,您需要使用 r2evans 的功能(或类似功能)以上是关于使用约束扩展网格(或电源集)的主要内容,如果未能解决你的问题,请参考以下文章