![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 262 Регистрация: 1.06.2022 Из: Донецк Пользователь №: 39632 ![]() |
Как посредством R случайным образом разделить ряд чисел на две группы заданных объемов с перебором всех возможных вариантов? Просто перемешивать исходный ряд и разделять в произвольной точке оказалось плохой идеей, так как порождаются в том числе и лишние варианты, когда состав обеих групп одинаков, но последовательность внутри них разная, например в итерации i в группе А оказываются 1, 2, 3, в группе Б - 4, 5, 6, а в итерации i+1 - соответственно 2, 1, 3 и 4, 5, 6. Если мы считаем статистику, инвариантную к порядку чисел, то эти паразитические псевдовыборки никак не сказываются на выводе, но сильно жрут вычислительные ресурсы. В общем, надо чтобы в каждой итерации группа А менялась с группой Б парой чисел.
Беглый поиск готовых решений ничего не дал. Например, в широко известном пакете permute, кажется, реализованы все мыслимые планы перестановок, кроме нужного мне. Или же я просто не допер, как его на это запрограммировать. |
|
![]() |
![]() |
![]() |
![]()
Сообщение
#2
|
|
Группа: Пользователи Сообщений: 262 Регистрация: 1.06.2022 Из: Донецк Пользователь №: 39632 ![]() |
Сделал! И даже пакетов дополнительных не понадобилось.
Код recomb<-function(x, y) { k<-max(c(length(x), length(y))) xy<-c(x, y) n<-length(xy) id<-1:n combmat<-combn(id, k) recb<-function(X, xy) { x<-xy[X] y<-xy[-X] if(length(x)==length(y)) return (data.frame(x=x, y=y)) else return(list(x, y)) } result<-apply(combmat, 2, recb, xy=xy) return(result) } #Пример: x<-c(1, 2) y<-c(10, 20) recomb(x, y) Выдача (в случае равных длин обоих последовательностей): Код [[1]] x y 1 1 10 2 2 20 [[2]] x y 1 1 2 2 10 20 [[3]] x y 1 1 2 2 20 10 [[4]] x y 1 2 1 2 10 20 [[5]] x y 1 2 1 2 20 10 [[6]] x y 1 10 1 2 20 2 Получилось почти в том же порядке, что и выдача из моей головы (см. выше). При неравных длинах будет корявее. Осталось разобраться, принесет ли мне сделанное пользу. Но это уже другая история. |
|
![]() |
![]() |
![]() ![]() |