Я думаю, что есть два очевидных способа сделать это.
Я запишу математические модели, которые сделают более формальной мою интерпретацию вашей проблемы.
Квадратичная формулировка
Первый - это метод наименьших квадратов .Пусть
x(i) = 1 if row i is selected
0 otherwise
Тогда мы можем написать:
min sum(j, w(j)*d(j)^2)
d(j) = sum(i, a(i,j)*x(i)) - t(j)
d(j) : free variable (can be substituted out if wanted)
где
t(j) : target sum for column j (0 and 3 in your example)
w(j) : weight for column j (choose 1 if there is no good reason to use something else)
a(i,j) : your data matrix (or data frame)
Это называется моделью MIQP (смешанное целочисленное квадратичное программирование).Существуют решатели MIQP для R.
Линейная формулировка
Вместо наименьших квадратов мы можем выбрать наименьших абсолютных отклонений .Модель высокого уровня может выглядеть следующим образом:
min sum(j, w(j)*|d(j)|)
d(j) = sum(i, a(i,j)*x(i)) - t(j)
d(j) : free variable (can be substituted out if wanted)
Чтобы сделать эту модель MIP (Mixed Integer Programming) правильной, нам нужно сделать все линейным.Одна из возможных формулировок:
min sum(j, w(j)*y(j))
d(j) = sum(i, a(i,j)*x(i)) - t(j)
-y(j) <= d(j) <= y(j) (we can write this as two inequalities)
d(j) : free variable
y(j) >= 0 (positive variable)
Существует множество решателей MIP, доступных для использования с R.