Форум врачей-аспирантов

Здравствуйте, гость ( Вход | Регистрация )

> Как реализовать точную перестановку в R?
ИНО
сообщение 29.05.2025 - 02:34
Сообщение #1





Группа: Пользователи
Сообщений: 262
Регистрация: 1.06.2022
Из: Донецк
Пользователь №: 39632



Как посредством R случайным образом разделить ряд чисел на две группы заданных объемов с перебором всех возможных вариантов? Просто перемешивать исходный ряд и разделять в произвольной точке оказалось плохой идеей, так как порождаются в том числе и лишние варианты, когда состав обеих групп одинаков, но последовательность внутри них разная, например в итерации i в группе А оказываются 1, 2, 3, в группе Б - 4, 5, 6, а в итерации i+1 - соответственно 2, 1, 3 и 4, 5, 6. Если мы считаем статистику, инвариантную к порядку чисел, то эти паразитические псевдовыборки никак не сказываются на выводе, но сильно жрут вычислительные ресурсы. В общем, надо чтобы в каждой итерации группа А менялась с группой Б парой чисел.

Беглый поиск готовых решений ничего не дал. Например, в широко известном пакете permute, кажется, реализованы все мыслимые планы перестановок, кроме нужного мне. Или же я просто не допер, как его на это запрограммировать.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
 
Открыть тему
Ответов
ИНО
сообщение 31.05.2025 - 22:48
Сообщение #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


Получилось почти в том же порядке, что и выдача из моей головы (см. выше). При неравных длинах будет корявее.

Осталось разобраться, принесет ли мне сделанное пользу. Но это уже другая история.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 

Сообщений в этой теме


Добавить ответ в эту темуОткрыть тему