我必须总计一个表的行和列的总数。在示例中为31、92、59和64。每个单元格也可以得到示例中指示的最大值(例如:单元格1的最大值为20,依此类推)。
示例:
如何在R中对其进行编码?我尝试了重复循环,但没有成功!
答案 0 :(得分:1)
您的表格如下:
a b | sab
c d | scd
----------
sac sbd| S
,您有4个约束的4个未知数(暂时忘记a,b,c和d的最大约束):
a + b = sab
a + c = sac
c + d = scd
b + d = sbd
这四个约束不是独立的(否则,您将只有一个可能的解决方案!),并且 一点代数表明,该线性系统的矩阵的秩为3。所以您有一个度数 玩的自由。以a为例,然后将a从0更改为最大值。对于每个值 然后使用行和列总和约束计算b,c和d,并检查它们是否满足 积极性和最大约束条件。
您的示例的R代码如下:
sab <- 59
scd <- 64
sac <- 31
sbd <- sab + scd - sac ### this is always true
amax <- 20
bmax <- 40
cmax <- 12
dmax <- 70
### let us vary a, our only degree of freedom
for (a in 0:amax){
### let us compute b, c and d by satisfying row and column sum constraints
b <- sab - a
c <- sac - a
d <- sbd - b
### let us check inequality constraints
if (b <= bmax && b>= 0 && c <= cmax && c >= 0 && d <= dmax && d >= 0){
cat("\nSolution:\n")
print(m <- rbind(c(a,b),c(c,d)))
cat("\nrowSums:", rowSums(m))
cat("\ncolsums:", colSums(m))
cat("\n---------------\n")
if (! identical(rowSums(m), c(sab,scd)))
stop("\nrow sum is not right!\n")
if (! identical(colSums(m), c(sac,sbd)))
stop("\ncolumns sum is not right!\n")
}
}