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.gridcombn,但我似乎没有做对。任何帮助表示赞赏!

谢谢!

【问题讨论】:

只是我从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 个可能条件 (+/-) 的元素向量的所有可能组合的主要内容,如果未能解决你的问题,请参考以下文章

生成非连续组合

使用 R 和来自 R 数据帧的条件查询 MS SQL

使用切换方法选择具有条件的多个元素

来自 selectInput 的具有多个条件的闪亮 R 观察事件

R:具有 2 个大型数据集的模式匹配金融时间序列数据:

Microsoft Access - 具有来自不同表的多个条件的 Dlookup