我正在做一个二进制整数编程任务,我希望有一个捷径来输入约束的所有 1 和 0。我创建了两个矩阵。第一个包含所有零,第二个包含所有零。
我有 34 个变量并创建了两个这样的矩阵(尽管我可能不需要创建这些(:
zero_constraints = matrix(data = 0, nrow = 1, ncol = 34)
one_constraints = matrix(data = 1, nrow = 1, ncol = 34)
下面是约束的示例:
# He therefore decides to include only one collage.
filter(data_raw, data_raw$Medium.Style == "Collage")$ID
输出:
[1] 9 16 29 30
我给每个变量一个数字,所以这些数字意味着我需要变量 9、16、29 和 30 为 1,其余变量为 0。
这是我迷路的地方:
one_constraints[, c(filter(data_raw, data_raw$Medium.Style == "Collage")$ID)]
我知道上面的一行从我的 34 个 1 矩阵中得到了我需要的"一",所以我试图连接我的两个矩阵 1 和 0:
cat(
one_constraints[, c(filter(data_raw, data_raw$Medium.Style == "Collage")$ID)],
zero_constraints[, -c(filter(data_raw, data_raw$Medium.Style == "Collage")$ID)]
)
输出:
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
但这不是所需的输出。开头不应该排成一排。它应该看起来像这样:
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
如果这太复杂,我可以按照我最初的计划来绑定矩阵,这就是我创建上述矩阵的方式。
如果需要该代码:
cbind(
matrix(data = 0, nrow = 1, ncol = 8), # 1-8
1, # 9
matrix(data = 0, nrow = 1, ncol = 6), # 10-15
1, # 16
matrix(data = 0, nrow = 1, ncol = 12), # 17
1, 1, # 29, 30
matrix(data = 0, nrow = 1, ncol = 4) # 31-34
)
编辑我尝试了这个答案:
inds <- c(9, 16, 29, 30)
mat <- matrix(0, ncol = 34)
mat[, inds] <- 1
通过这样做:
twnety_one_con <- filter(data_raw, data_raw$Medium.Style == "Collage")$ID
twnety_one_mat <- matrix(data = 0, nrow = 1, ncol =34)
mat <- (twnety_one_mat[, twnety_one_mat] <- 1)
我可能做错了,但它不起作用。它返回一个向量 1,当我把它放在我的 add.constraint 代码位时,它确认它与向量长度不匹配
您可以使用:
inds <- c(9, 16, 29, 30)
mat <- matrix(0, ncol = 34)
mat[, inds] <- 1
在 OP 的函数中,filter
步骤中的索引返回表示列索引的 'ID'。 我们只需要将 (<-
( 值分配给 1
inds <- c(9, 16, 29, 30)
mat <- matrix(0, ncol = 34)
mat[, inds] <- 1
mat
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] #[,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
#[1,] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 #1 0 0 0 0 0 0 0 0
# [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34]
#[1,] 0 0 0 0 1 1 0 0 0 0