В приведенном ниже коде мы определяем комбинации значений с суммами в требуемом диапазоне, а затем получаем индексы этих комбинаций. Затем мы используем индексы, чтобы получить имена элементов, которые мы хотим суммировать вместе. lapply
выполняет итерацию для каждого числа значений, которые мы хотим суммировать.
Это упаковано в функцию, где x
- именованный вектор чисел, n
- максимальное количество значений, которые вы хотите суммировать вместе, а interval
- диапазон, в котором должны быть суммы.
Обратите внимание, что нижеприведенная функция возвращает строки вида "A + B"
, как описано в вашем вопросе. Если ваша цель состоит в том, чтобы выполнить дополнительную обработку комбинаций букв, вам, вероятно, будет лучше работать напрямую с матрицами (или списками) комбинаций, возвращаемых combn()
.
numbers <- c(40,60,20,65,45,30,5,70,100,85,75,10);
names(numbers) <- LETTERS[1:length(numbers)]
library(dplyr) # For between function
combos = function(x, n, interval) {
res = lapply(2:n, function(i) {
cc = combn(x, i)
idx = which(between(colSums(cc), interval[1], interval[2]))
apply(combn(names(x), i)[ , idx], 2, paste, collapse=" + ")
})
cbind(unlist(c(names(x)[between(x, interval[1], interval[2])], res)))
}
combos(numbers, 3, c(90, 110))
[,1]
[1,] "I"
[2,] "A + B"
[3,] "A + D"
[4,] "A + H"
[5,] "B + E"
[6,] "B + F"
[7,] "C + H"
[8,] "C + J"
[9,] "C + K"
[10,] "D + E"
[11,] "D + F"
[12,] "F + H"
[13,] "F + K"
[14,] "G + I"
[15,] "G + J"
[16,] "I + L"
[17,] "J + L"
[18,] "A + B + G"
[19,] "A + B + L"
[20,] "A + C + E"
[21,] "A + C + F"
[22,] "A + D + G"
[23,] "A + E + G"
[24,] "A + E + L"
[25,] "B + C + F"
[26,] "B + C + L"
[27,] "B + E + G"
[28,] "B + F + G"
[29,] "B + F + L"
[30,] "C + D + G"
[31,] "C + D + L"
[32,] "C + E + F"
[33,] "C + G + H"
[34,] "C + G + J"
[35,] "C + G + K"
[36,] "C + H + L"
[37,] "C + K + L"
[38,] "D + F + G"
[39,] "D + F + L"
[40,] "F + G + H"
[41,] "F + G + K"
[42,] "F + H + L"
[43,] "G + J + L"
[44,] "G + K + L"
set.seed(2)
nn = rnorm(10)
names(nn) = LETTERS[1:length(nn)]
combos(nn, 3, c(2,2.5))
[,1]
[1,] "B + I"
[2,] "C + G"
[3,] "F + I"
[4,] "B + C + G"
[5,] "B + E + I"
[6,] "B + F + I"
[7,] "B + I + J"
[8,] "C + D + I"
[9,] "C + E + G"
[10,] "C + F + G"
[11,] "C + G + H"
[12,] "C + G + J"
[13,] "E + F + I"
[14,] "G + H + I"