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 行。
假设我想创建“三角形”的每个排列,以便没有两个元音字母不能彼此相邻。在数学上我解决如下: 一开始我有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 行。