У меня есть пул из семи номеров.Я хотел бы сгенерировать все векторы длины 7 с помощью:
- два первых элемента взяты из пула из 7 чисел.
- два следующих элемента взяты из 5 оставшихся чисел.
- три последних элемента взяты из трех оставшихся чисел.
Этот способ можно описать вектором c (2,2,3).
For example:
sample <- c(8.93,9.11,9.12,9.05,8.87,8.95,9.02)
structure <- c(2,2,3)
Я знаю, что есть 7C2 * 5C2 * 3C3 = 210 таких векторов.Чтобы быть более понятным, мне не нужно перестановку внутри каждой группы элементов, например, два вектора c(8.93,9.11,9.12,9.05,8.87,8.95,9.02)
и c(9.11,8.93,9.12,9.05,8.87,8.95,9.02)
одинаковы для меня, мне нужно только один из них появиться в списке из 210 векторов.
Вот что я сделал, используя for
loop, combn
и setdiff
.Однако я хотел бы использовать вектор structure
в коде, а также сделать его более гибким, например, c(2,5)
вместо c(2,2,3)
.Есть ли более простое решение для обобщения моей проблемы, например, с помощью семейства функций apply
?
df<-data.frame()
sample <- c(8.93,9.11,9.12,9.05,8.87,8.95,9.02)
combn(sample,2) -> com1
for (i in 1:ncol(com1)){
com1[,i]
setdiff(sample,com1[,i]) -> com2
combn(com2,2) -> com3
for (j in 1:ncol(com3)){
setdiff(com2,com3[,j]) -> com4
c(com1[,i],com3[,j],com4) -> de
df <- rbind(df,de)
}
}
df