gpt4 book ai didi

r - 具有多个约束的所有组合

转载 作者:行者123 更新时间:2023-12-04 11:31:24 26 4
gpt4 key购买 nike

我希望生成一组数字的所有可能组合,但有多个约束。我在 Stack Overflow 上发现了几个类似的问题,但似乎没有一个能解决我的所有限制:

R: sample() command subject to a constraint

R all combinations of 3 vectors with conditions

Generate all combinations given a constraint

R - generate all combinations from 2 vectors given constraints

下面是一个示例数据集。无论如何,在我看来,这是一个确定性数据集。

desired.data <- read.table(text = '
x1 x2 x3 x4
1 1 1 1
1 1 1 2
1 1 1 3
1 1 2 1
1 1 2 2
1 1 2 3
1 1 3 3
1 2 1 1
1 2 1 2
1 2 1 3
1 2 2 1
1 2 2 2
1 2 2 3
1 2 3 3
1 3 3 3
0 1 1 1
0 1 1 2
0 1 1 3
0 1 2 1
0 1 2 2
0 1 2 3
0 1 3 3
0 0 1 1
0 0 1 2
0 0 1 3
0 0 0 1
', header = TRUE, stringsAsFactors = FALSE, na.strings = 'NA')

约束条件如下:

  1. 第 1 列只能包含 0 或 1
  2. 最后一列只能包含1、2或3
  3. 所有其他列可以包含 0、1、2 或 3
  4. 一旦非 0 出现在一行中,该行的其余部分不能包含另一个 0
  5. 一旦 3 出现在一行中,该行的其余部分必须只包含 3
  6. 一行中第一个非0数必须是1

我知道生成此类数据集的唯一方法是使用嵌套的 for-loops,如下所示。我已经使用这种技术多年,最后决定询问是否有更好的方法。

我希望这不是重复的,我希望它不会被认为太专业。我经常创建这些类型的数据集,一个更简单的解决方案会很有帮助。

my.data <- matrix(0, ncol = 4, nrow = 25)
my.data <- as.data.frame(my.data)

j <- 1

for(i1 in 0:1) {

if(i1 == 0) i2.begin = 0
if(i1 == 0) i2.end = 1
if(i1 == 1) i2.begin = 1
if(i1 == 1) i2.end = 3
if(i1 == 2) i2.begin = 1
if(i1 == 2) i2.end = 3
if(i1 == 3) i2.begin = 3
if(i1 == 3) i2.end = 3

for(i2 in i2.begin:i2.end) {

if(i2 == 0) i3.begin = 0
if(i2 == 0) i3.end = 1
if(i2 == 1) i3.begin = 1
if(i2 == 1) i3.end = 3
if(i2 == 2) i3.begin = 1
if(i2 == 2) i3.end = 3
if(i2 == 3) i3.begin = 3
if(i2 == 3) i3.end = 3

for(i3 in i3.begin:i3.end) {

if(i3 == 0) i4.begin = 1 # 1 not 0 because last column
if(i3 == 0) i4.end = 1
if(i3 == 1) i4.begin = 1
if(i3 == 1) i4.end = 3
if(i3 == 2) i4.begin = 1
if(i3 == 2) i4.end = 3
if(i3 == 3) i4.begin = 3
if(i3 == 3) i4.end = 3

for(i4 in i4.begin:i4.end) {

my.data[j,1] <- i1
my.data[j,2] <- i2
my.data[j,3] <- i3
my.data[j,4] <- i4

j <- j + 1

}
}
}
}

my.data
dim(my.data)

这是输出:

   V1 V2 V3 V4
1 0 0 0 1
2 0 0 1 1
3 0 0 1 2
4 0 0 1 3
5 0 1 1 1
6 0 1 1 2
7 0 1 1 3
8 0 1 2 1
9 0 1 2 2
10 0 1 2 3
11 0 1 3 3
12 1 1 1 1
13 1 1 1 2
14 1 1 1 3
15 1 1 2 1
16 1 1 2 2
17 1 1 2 3
18 1 1 3 3
19 1 2 1 1
20 1 2 1 2
21 1 2 1 3
22 1 2 2 1
23 1 2 2 2
24 1 2 2 3
25 1 2 3 3
26 1 3 3 3

编辑

抱歉,我最初忘记包含约束 #6。

最佳答案

这是为这个特定示例创建所需数据集的代码。我怀疑代码可以推广。如果我成功地概括了它,我将发布结果。尽管代码凌乱且不直观,但我相信存在一个基本的通用模式。

desired.data <- read.table(text = '

x1 x2 x3 x4
1 1 1 1
1 1 1 2
1 1 1 3
1 1 2 1
1 1 2 2
1 1 2 3
1 1 3 3
1 2 1 1
1 2 1 2
1 2 1 3
1 2 2 1
1 2 2 2
1 2 2 3
1 2 3 3
1 3 3 3
0 1 1 1
0 1 1 2
0 1 1 3
0 1 2 1
0 1 2 2
0 1 2 3
0 1 3 3
0 0 1 1
0 0 1 2
0 0 1 3
0 0 0 1
', header = TRUE, stringsAsFactors = FALSE, na.strings = 'NA')

n <- 3 # non-zero numbers
m <- 4-2 # number of middle columns

x1 <- rep(1:0, c(((n*(n-1)) * (n-1) + n), (n*(n-1) + n + (n-1))))
x2 <- rep(c(1:n, 1:0), c(n*m+1, n*m+1, 1, n*m+1, n*1+1))
x3 <- rep(c(rep(1:n, n-1), n, 1:n, 1:0), c(rep(c(n,n,1), n-1), 1, n,n,1, n,1))
x4 <- c(rep(c(rep(1:n, (n-1)), n), (n-1)), n, rep(1:n,(n-1)), n, 1:n, 1)

my.data <- data.frame(x1, x2, x3, x4)

all.equal(desired.data, my.data)
# [1] TRUE

关于r - 具有多个约束的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31616526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com