R разбить последовательность заданных чисел на различные комбинации - PullRequest
0 голосов
/ 27 апреля 2019

Предположим, мы дали последовательность чисел:

z=c(1,2,3,4,5)

Я хочу создать все возможные классы (различного размера) из данной последовательности чисел следующим образом:

1) Самый упрощенный случай - это когда размер класса равен 1, т.е. все размеры классов равны. В этом случае у нас есть следующие группы: 1-2,2-3,3-4 и 4-5.

2) Когда один или несколько размеров класса могут быть равны 2.

а) У нас может быть 1 класс с размером 2 и все остальные с размером 1 следующим образом: 1-3,3-4 и 4-5. Точно так же 1-2,2-4 и 4-5 и 1-2,2-3 и 3-5.

b) У нас также могут быть случаи с 2 классами с размером 2. Например: 1-3 и 3-5.

3) Когда один размер класса 3 и один с размером 1. Например, 1-4 и 4-5 и 1-2 и 2-5.

4) Наконец, у нас будет один случай, когда размер класса равен 4, то есть 1-5.

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

Есть ли способ сделать это в R? Любая помощь будет оценена. Благодаря.

1 Ответ

1 голос
/ 27 апреля 2019

Редактировать: добавлена ​​конкретная реализация с использованием пакета partition.

Как это описано, звучит как один из способов думать об этом, поскольку у вас есть 5 слотов с 4 диапазонами между ними (тире), с3 потенциальные стены, отделяющие диапазоны от соседних соседей.

  | | |
1-2-3-4-5

Вы можете получить все комбинации, переключая каждый барьер со всех открытых:

   0 0 0
 1-2-3-4-5  
 one with class of sizes of 4

на все закрытые:

  | | |
1-2-3-4-5
one case with class sizes of 1
1-2
  2-3
    3-4
      4-5

Таким образом, все комбинации представляют собой двоичные числа от 000 (0) до 111 (7), всего 8, равное 2 ^ n, где n - количество стенок, которое является количеством элементовминус 2.

Один подход может использовать псевдокод, например, такой:

  1. Взять количество элементов - 2 = количество двоичных битов для представления всех решений
  2. Для каждого числаот 0 до 2 ^ (# элементов - 2), преобразовать в двоичный формат.
  3. Используйте позиции единиц для разделения диапазонов.
  4. Показать все диапазоны.
  5. ... Прибыль !!!

Похоже, есть хотя бы один пакетKage в R, который решает проблемы с разделами для вас.Вот реализация, использующая это и tidyverse манипуляций.

library(tidyverse)
partitions::compositions(4) %>% 
  as.matrix() %>%
  as_tibble() %>%
  mutate(position = row_number()) %>%
  gather(combo_num, segment_length, -position) %>%
  filter(segment_length > 0) %>%
  mutate(segment_label = paste0(position, "-", position + segment_length)) %>%
  select(-segment_length) %>%
  spread(position, segment_label)



# A tibble: 8 x 5
  combo_num `1`   `2`   `3`   `4`  
  <chr>     <chr> <chr> <chr> <chr>
1 V1        1-5   NA    NA    NA   
2 V2        1-2   2-5   NA    NA   
3 V3        1-3   2-4   NA    NA   
4 V4        1-2   2-3   3-5   NA   
5 V5        1-4   2-3   NA    NA   
6 V6        1-2   2-4   3-4   NA   
7 V7        1-3   2-3   3-4   NA   
8 V8        1-2   2-3   3-4   4-5  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...