r 中的排列

Permutation in r

假设我想创建“三角形”的每个排列,以便没有两个元音字母不能彼此相邻。在数学上我解决如下: 一开始我有5个!非元音的情况('t'、'r'、'n'、'g'、'l'),现在我有 6 个地方可以放 3 个元音字母('a', 'e', 'i').

我想在 R 中生成所有这些案例

可能值得说明对您的问题的蛮力方法。首先,我们生成所有排列,然后确定满足您标准的排列:

library(combinat)

triangle <- unlist(strsplit("triangle", ""))
triangle
# [1] "t" "r" "i" "a" "n" "g" "l" "e"
perms <- permn(triangle)
perms.mat <- do.call(rbind, perms)
dim(perms.mat)
# [1] 40320     8

变量triangle包含单词的字母作为向量。变量 perms 包含排列列表,perms.mat 是该列表的矩阵版本。有 40,320 种排列。有多少个有相邻的元音:

separate <- apply(perms.mat, 1, function(x) min(diff(which(x %in% c("a", "e", "i"))))>1)
perms.sep <- perms.mat[separate, ]
dim(perms.sep)
# [1] 14400     8

变量separate是一个逻辑向量,用于标识没有连续元音的排列。首先,我们确定具有元音 which(x %in% c("a", "e", "i") 的三个位置。然后我们取这些位置之间的差异,并取两个差异中的最小值。如果元音相邻,则它们的位置差将为 1。然后 perms.sep 包含 perms.mat 中没有相邻元音的 14,400 行。