如何生成字符串列表的所有排列?

时间:2021-04-08 22:28:47

标签: r string list character permutation

我有这样的字符数据

[[1]]
[1] "F" "S"

[[2]]
[1] "Y" "Q" "Q"

[[3]]
[1] "C" "T"

[[4]]
[1] "G" "M"

[[5]]
[1] "A" "M"

我想为每个单独的列表生成所有排列(不在列表之间混合)并将它们组合成一个大列表。

例如,对于第一个和第二个列表,即 "F" "S""Y" "Q" "Q",我想将排列列表设为 c("FS", "SF")c("YQQ", "QYQ", "QQY"),然后将它们合二为一。

3 个答案:

答案 0 :(得分:1)

看起来您想要的输出与此相关帖子 (Generating all distinct permutations of a list in R) 不完全相同。但我们可以建立在那里的答案的基础上。

library(combinat)

# example data, based on your description
X <- list(c("F","S"), c("Y", "Q", "Q"))

result <- lapply(X, function(x1) {
    unique(sapply(permn(x1), function(x2) paste(x2, collapse = "")))
})

print(result)

输出

 [[1]]
 [1] "FS" "SF"

 [[2]]
 [1] "YQQ" "QYQ" "QQY"

第一个(外部)lapply 迭代列表的每个元素,其中包含单个字母(在向量中)。每次迭代时,permn 都会接受单个字母(例如“F”和“S”),并返回一个包含所有可能排列的列表对象(例如“F”、“S”和“S”F”)。按照您的描述格式化输出,内部 sapply 将每个这些排列合并为单个字符值,过滤唯一值。

答案 1 :(得分:1)

这是使用 combinat::permn 的方法:

library(combinat)
lapply(data,function(x)unique(sapply(combinat::permn(x),paste,collapse = "")))
#[[1]]
#[1] "FS" "SF"
#
#[[2]]
#[1] "YQQ" "QYQ" "QQY"
#
#[[3]]
#[1] "CT" "TC"
#
#[[4]]
#[1] "GM" "MG"
#
#[[5]]
#[1] "AM" "MA"

或与 unlist 一起使用:

unlist(lapply(data,function(x)unique(sapply(combinat::permn(x),paste,collapse = ""))))
# [1] "FS"  "SF"  "YQQ" "QYQ" "QQY" "CT"  "TC"  "GM"  "MG"  "AM"  "MA" 

数据:

data <- list(c("F", "S"), c("Y", "Q", "Q"), c("C", "T"), c("G", "M"), 
    c("A", "M"))

答案 2 :(得分:1)

library(combinat)

final <- unlist(lapply(X , function(test_X) lapply(permn(test_X), function(x) paste(x,collapse='')) ))
相关问题