Генерация возможных последовательностей в R - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь решить следующую проблему в R. Обычно, учитывая последовательность [a, b], я должен сгенерировать списки из этой последовательности, имеющие длину n, чьи элементы попарно не менее с разницей d.

Я думал об использовании seq (), но с помощью этой функции вы можете создавать только равномерно расположенные последовательности.

1 Ответ

0 голосов
/ 03 февраля 2019

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

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

# sequence length of n which includes a, b
# therefore need to find n - 1 values (then check that last val of cumsum == b)
#   vals must be greater than or equal to d
#   vals have upper bound is if all but one value was d, b - ((n - 1) * d)
library(gtools)
library(matrixStats)

# parameters
a = 1
b = 20
n = 5
d = 2

# possible values that differences can be
poss_diffs <- d:(b - ((n - 1) * d))

# generate all possible permutations of differences
diff_perms_n <- permutations(n = length(poss_diffs), r = n - 1, v = poss_diffs)

# turn differences into sequences, add column for the a value
seqs_n <- matrixStats::rowCumsums(cbind(a, diff_perms_n))

# filter to only valid sequences, last column == b
valid_seqs <- seqs_n[seqs_n[, ncol(seqs_n)] == b, ]

# check that diffs are all greater than d
valid_seqs_diffs <- matrixStats::rowDiffs(valid_seqs)

print(head(valid_seqs))
print(head(valid_seqs_diffs))

# > print(head(valid_seqs))
# [,1] [,2] [,3] [,4] [,5]
# [1,]    1    3    6   10   20
# [2,]    1    3    6   11   20
# [3,]    1    3    6   12   20
# [4,]    1    3    6   14   20
# [5,]    1    3    6   15   20
# [6,]    1    3    6   16   20
# > print(head(valid_seqs_diffs))
# [,1] [,2] [,3] [,4]
# [1,]    2    3    4   10
# [2,]    2    3    5    9
# [3,]    2    3    6    8
# [4,]    2    3    8    6
# [5,]    2    3    9    5
# [6,]    2    3   10    4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...