2012-04-26 6 views
0

Я хотел бы спросить, если некоторые из вас не знают какой-либо простой способ решить эту проблему: Мне нужно сгенерировать все комбинации чисел A, взятых из множества B (0,1,2 ... в), их сумма = C.Сгенерировать векторы, используя R

т.е. если A=2, B=3, C=2:

Решение в этом случае:

(1,1);(0,2);(2,0) 

Таким образом, векторы длины 2 (А), сумма всех его позиций равна 2 (C), возможные значения для каждый из элементов векторов исходит из множества {0,1,2,3} (максимум - B).

+0

Нет смысла тестировать элементы B выше C. –

ответ

1
z <- expand.grid(0:3,0:3) 
z[rowSums(z)==2, ] 
    Var1 Var2 
3 2 0 
5 1 1 
7 0 2 

Если вы хотите, чтобы сделать расширение сетки программно это будет работать:

z <- expand.grid(rep(list(C), A)) 

Вам нужно расширить как список, так что элементы остаются разделенными. rep(0:3, 3) не возвратит 3 отдельных последовательности. Так что для A = 3:

> z <- expand.grid(rep(list(0:3), 3)) 
> z[rowSums(z)==2, ] 
    Var1 Var2 Var3 
3  2 0 0 
6  1 1 0 
9  0 2 0 
18 1 0 1 
21 0 1 1 
33 0 0 2 
1

Функциональная версия, так как я уже началась до SO обновление:

A=2 
B=3 
C=2 

myfun <- function(a=A, b=B, c=C) { 
    out <- do.call(expand.grid, lapply(1:a, function(x) 0:b)) 
    return(out[rowSums(out)==c,]) 
} 

> out[rowSums(out)==c,] 
    Var1 Var2 
3 2 0 
6 1 1 
9 0 2 
1

Используя изящную partitions() пакет, и более интересные значения A, B и C:

library(partitions) 

A <- 2 
B <- 5 
C <- 7 

comps <- t(compositions(C, A)) 
ii <- apply(comps, 1, FUN=function(X) all(X %in% 0:B)) 
comps[ii, ] 
#  [,1] [,2] 
# [1,] 5 2 
# [2,] 4 3 
# [3,] 3 4 
# [4,] 2 5 
Смежные вопросы