我有这样的字符数据
[[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")
,然后将它们合二为一。
答案 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='')) ))