R:来自具有 2 个可能条件 (+/-) 的元素向量的所有可能组合
Posted
技术标签:
【中文标题】R:来自具有 2 个可能条件 (+/-) 的元素向量的所有可能组合【英文标题】:R: all possible combinations from a vector of elements with 2 possible conditions (+/-) 【发布时间】:2021-01-10 09:36:47 【问题描述】:我有一个名为 markers
的元素向量,其形式为:
markers <- LETTERS[1:5]
markers
中的每个元素都是布尔类型,有两个可能的条件 +
和 -
。我想要一种快速有效的方法来获得所有可能的组合,以便考虑这两个条件(即使条件不同,标记也不能与自身配对)。
理想情况下,结果只是一个字符向量或一个列表,其中的元素是由/
分隔的标记组合。
此示例中包含五个字母的元素应为:
A-/B-/C-/D-/E-
A-/B+/C-/D-/E-
A-/B-/C+/D-/E-
A-/B-/C-/D+/E-
A-/B-/C-/D-/E+
A-/B+/C+/D-/E-
A-/B+/C-/D+/E-
A-/B+/C-/D-/E+
A-/B+/C+/D+/E-
A-/B+/C+/D-/E+
A-/B+/C+/D+/E+
A+/B-/C-/D-/E-
A+/B+/C-/D-/E-
A+/B-/C+/D-/E-
A+/B-/C-/D+/E-
A+/B-/C-/D-/E+
A+/B+/C+/D-/E-
A+/B+/C-/D+/E-
A+/B+/C-/D-/E+
A+/B+/C+/D+/E-
A+/B+/C+/D-/E+
A+/B+/C+/D+/E+
...
不确定我是否遗漏了任何组合,但你明白了……我一直在尝试使用 expand.grid
和 combn
,但我似乎没有做对。任何帮助表示赞赏!
谢谢!
【问题讨论】:
只是我从c('A','B','C'...)
之类的向量开始,但每个元素可以采用-
或+
两种可能的形式,如'A+'、'A-'、'B+ '、'B-' 等。我希望这反映在结果组合向量中(但 A-
不能与 A+
组合)
【参考方案1】:
markers <- LETTERS[1:5]
test <- expand.grid(lapply(seq(markers), function(x) c("+","-")),stringsAsFactors=FALSE)
> test
Var1 Var2 Var3 Var4 Var5
1 + + + + +
2 - + + + +
3 + - + + +
4 - - + + +
....
apply(test,1,function(x)paste0(markers,x,collapse = "/"))
[1] "A+/B+/C+/D+/E+" "A-/B+/C+/D+/E+" "A+/B-/C+/D+/E+" "A-/B-/C+/D+/E+" "A+/B+/C-/D+/E+" "A-/B+/C-/D+/E+" "A+/B-/C-/D+/E+"
[8] "A-/B-/C-/D+/E+" "A+/B+/C+/D-/E+" "A-/B+/C+/D-/E+" "A+/B-/C+/D-/E+" "A-/B-/C+/D-/E+" "A+/B+/C-/D-/E+" "A-/B+/C-/D-/E+"
[15] "A+/B-/C-/D-/E+" "A-/B-/C-/D-/E+" "A+/B+/C+/D+/E-" "A-/B+/C+/D+/E-" "A+/B-/C+/D+/E-" "A-/B-/C+/D+/E-" "A+/B+/C-/D+/E-"
[22] "A-/B+/C-/D+/E-" "A+/B-/C-/D+/E-" "A-/B-/C-/D+/E-" "A+/B+/C+/D-/E-" "A-/B+/C+/D-/E-" "A+/B-/C+/D-/E-" "A-/B-/C+/D-/E-"
[29] "A+/B+/C-/D-/E-" "A-/B+/C-/D-/E-" "A+/B-/C-/D-/E-" "A-/B-/C-/D-/E-"
【讨论】:
您可能想在 expand.grid 中使用:stringsAsFactors=FALSE
(在 R4.0.2 上它仍设置为 TRUE)。然后你可以删除 mutate_all
不错的优雅解决方案!是的,我也打算提到 stringsAsFactors 参数,不需要 mutate 行
谢谢!不知道stringAsfactors的争论,帮了大忙。已编辑【参考方案2】:
要添加到@denis 出色的基本 R 答案,这里是使用 RcppAlgos
* 的单行代码。它应该比建议的解决方案更有效:
n <- 5
RcppAlgos::permuteGeneral(c("+", "-"), n, repetition = TRUE, FUN = function(x)
paste0(LETTERS[1:n], x, collapse = "/")
)
[[1]]
[1] "A+/B+/C+/D+/E+"
[[2]]
[1] "A+/B+/C+/D+/E-"
[[3]]
[1] "A+/B+/C+/D-/E+"
.
.
.
[[30]]
[1] "A-/B-/C-/D+/E-"
[[31]]
[1] "A-/B-/C-/D-/E+"
[[32]]
[1] "A-/B-/C-/D-/E-"
需要注意的是,大部分计算都是处理字符向量的操作。因此,无论您使用什么工具,都很难实现任何形式的巨大效率提升。
*我是作者
【讨论】:
以上是关于R:来自具有 2 个可能条件 (+/-) 的元素向量的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章