Создание определенной последовательности в R - PullRequest
1 голос
/ 04 июня 2019

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

'0-0-0-0-0-0'
'0-1-0-0-0-0'
'0-0-1-0-0-0'
'0-0-0-1-0-0'
'0-0-0-0-1-0'
'0-0-0-0-0-1'
'1-0-0-0-0-0'
'1-1-0-0-0-0'
'1-0-1-0-0-0'
'1-0-0-1-0-0'
'1-0-0-0-1-0'
'1-0-0-0-0-1'
'1-1-1-1-1-1'
'2-0-0-0-0-0'
'2-1-0-0-0-0'
'2-0-1-0-0-0'
'2-0-0-1-0-0'
'2-0-0-0-1-0'
'2-0-0-0-0-1'
'3-0-0-0-0-0'
'3-1-0-0-0-0'
'3-0-1-0-0-0'
'3-0-0-1-0-0'
'3-0-0-0-1-0'
'3-0-0-0-0-1'
'0-2-0-0-0-0'
'0-0-2-0-0-0'
'0-0-0-2-0-0'
'0-0-0-0-2-0'
'0-0-0-0-0-2'
 and so on...

Более подробно о деталях представленного шаблона: у меня есть 4 состояния {0,1,2,3}, и яхотите найти все возможные комбинации для последовательностей length=6, начиная с любого из состояний и позволяя присутствовать только одной промежуточной позиции последовательности в любой из следующих позиций.

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

Вот один из методов.Я генерирую простое описание каждой последовательности, затем строю последовательности (и дедуплицирую, что необходимо из-за элементов all-middle-0).

dd = expand.grid(first = 0:3, inter_value = 0:3, inter_position = 2:6)

result = t(apply(dd, 1, function(x) {
  z = c(x["first"], rep(0L, 5))
  z[x["inter_position"]] = x["inter_value"]
  z
}))

result = result[!duplicated(result), ]

dim(result)
# [1] 64  6
head(result, 10)
#       first          
#  [1,]     0 0 0 0 0 0
#  [2,]     1 0 0 0 0 0
#  [3,]     2 0 0 0 0 0
#  [4,]     3 0 0 0 0 0
#  [5,]     0 1 0 0 0 0
#  [6,]     1 1 0 0 0 0
#  [7,]     2 1 0 0 0 0
#  [8,]     3 1 0 0 0 0
#  [9,]     0 2 0 0 0 0
# [10,]     1 2 0 0 0 0

Получение тире:

apply(result, 1, paste, collapse = "-")
#  [1] "0-0-0-0-0-0" "1-0-0-0-0-0" "2-0-0-0-0-0" "3-0-0-0-0-0" "0-1-0-0-0-0" "1-1-0-0-0-0" "2-1-0-0-0-0"
#  [8] "3-1-0-0-0-0" "0-2-0-0-0-0" "1-2-0-0-0-0" "2-2-0-0-0-0" "3-2-0-0-0-0" "0-3-0-0-0-0" "1-3-0-0-0-0"
# [15] "2-3-0-0-0-0" "3-3-0-0-0-0" "0-0-1-0-0-0" "1-0-1-0-0-0" "2-0-1-0-0-0" "3-0-1-0-0-0" "0-0-2-0-0-0"
# [22] "1-0-2-0-0-0" "2-0-2-0-0-0" "3-0-2-0-0-0" "0-0-3-0-0-0" "1-0-3-0-0-0" "2-0-3-0-0-0" "3-0-3-0-0-0"
# [29] "0-0-0-1-0-0" "1-0-0-1-0-0" "2-0-0-1-0-0" "3-0-0-1-0-0" "0-0-0-2-0-0" "1-0-0-2-0-0" "2-0-0-2-0-0"
# [36] "3-0-0-2-0-0" "0-0-0-3-0-0" "1-0-0-3-0-0" "2-0-0-3-0-0" "3-0-0-3-0-0" "0-0-0-0-1-0" "1-0-0-0-1-0"
# [43] "2-0-0-0-1-0" "3-0-0-0-1-0" "0-0-0-0-2-0" "1-0-0-0-2-0" "2-0-0-0-2-0" "3-0-0-0-2-0" "0-0-0-0-3-0"
# [50] "1-0-0-0-3-0" "2-0-0-0-3-0" "3-0-0-0-3-0" "0-0-0-0-0-1" "1-0-0-0-0-1" "2-0-0-0-0-1" "3-0-0-0-0-1"
# [57] "0-0-0-0-0-2" "1-0-0-0-0-2" "2-0-0-0-0-2" "3-0-0-0-0-2" "0-0-0-0-0-3" "1-0-0-0-0-3" "2-0-0-0-0-3"
# [64] "3-0-0-0-0-3"
1 голос
/ 04 июня 2019

Вот общее решение для вложенного цикла.Не самый эффективный в мире, но получает желаемый результат (Примечание: вы можете изменить states и / или sequence_len, и последовательности будут сгенерированы автоматически):

states <- 0:3
states_len <- length(states)
sequence_len <- 6
sequence_mat <- matrix(0, states_len*{{states_len-1}*{sequence_len-1}+1}, sequence_len)
rw <- 1
for(ii in states){
  for(jj in states){
    for(kk in 2:sequence_len){
      if(jj != 0){
        rw = rw + 1
      }
      sequence_mat[rw, 1] <- ii
      sequence_mat[rw, kk] <- jj
      if(jj == rev(states)[1] && kk == sequence_len){
        rw = rw + 1
      }
    }
  }
}

Вывод:

> head(sequence_mat, 20)
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    0    0    0    0    0    0
 [2,]    0    1    0    0    0    0
 [3,]    0    0    1    0    0    0
 [4,]    0    0    0    1    0    0
 [5,]    0    0    0    0    1    0
 [6,]    0    0    0    0    0    1
 [7,]    0    2    0    0    0    0
 [8,]    0    0    2    0    0    0
 [9,]    0    0    0    2    0    0
[10,]    0    0    0    0    2    0
[11,]    0    0    0    0    0    2
[12,]    0    3    0    0    0    0
[13,]    0    0    3    0    0    0
[14,]    0    0    0    3    0    0
[15,]    0    0    0    0    3    0
[16,]    0    0    0    0    0    3
[17,]    1    0    0    0    0    0
[18,]    1    1    0    0    0    0
[19,]    1    0    1    0    0    0
[20,]    1    0    0    1    0    0
...