如何在R中生成向量所有含算术运算的组合(含括号分组)
在R中生成变量的所有算术运算排列组合(含括号分组)
核心需求
我需要在R中实现对变量的全量算术运算排列组合生成,用于手动机器学习筛选最优变量组合划分数据集,也可直接用于线性模型建模。具体要求包括:
1. 基础运算组合
针对输入变量,生成所有单个变量、以及变量间两两加减乘除的组合(含交换顺序的情况,比如cat-dog和dog-cat)。示例如下:
testvector <- c("cat", "dog") # 预期输出 c("cat","dog","cat+dog","cat-dog","dog-cat","cat*dog","cat/dog","dog/cat")
我有大约10个变量,手动编写所有组合完全不现实,此前在Python中找到过类似实现方案,但需要在R中完成。
2. 支持括号分组运算
除基础运算外,还需要支持带括号的分组运算,生成类似如下的表达式:
# 输入示例 testvector <- c("cat","dog","bird") # 预期输出示例(仅展示部分有效组合) c("(cat-dog)/bird","(bird+cat)/dog","(dog+bird)*cat")
另外,如果针对数值型向量提前计算运算结果,再将结果用于建模也是可行的方案。
现有代码及待优化点
我已经编写了初步代码,但存在两个关键问题需要优化:
- 问题a:无法适配任意长度的
testvector,每次新增变量都需要手动调整公式结构 - 问题b:生成了大量无意义的表达式(比如
dog)、(dog+dog)+dog)这类带多余括号的无效内容),虽然后者可以通过循环过滤无效数值来处理,但优先级相对较低
现有代码如下:
testvector <- c("dog","cat","bird") testvector <- c(paste0(testvector,")"), paste0("(",testvector), testvector) c(testvector, do.call(paste, c(subset(expand.grid(testvector ,c("+", "-", "*", "/") , testvector ,c("+", "-", "*", "/") , testvector) ), sep = ""))) # 输出头部内容: [1] "dog)" "cat)" "bird)" "(dog" "(cat" [6] "(bird" "dog" "cat" "bird" "cat)+dog)+dog)" [11] "bird)+dog)+dog)" "(dog+dog)+dog)" "(cat+dog)+dog)" "(bird+dog)+dog)" "dog+dog)+dog)" [16] "cat+dog)+dog)" "bird+dog)+dog)" "cat)-dog)+dog)" "bird)-dog)+dog)" "(dog-dog)+dog)" [21] "(cat-dog)+dog)" "(bird-dog)+dog)" "dog-dog)+dog)" "cat-dog)+dog)" "bird-dog)+dog)" [26] "cat)*dog)+dog)" "bird)*dog)+dog)" "(dog*dog)+dog)" "(cat*dog)+dog)" "(bird*dog)+dog)" [31] "dog*dog)+dog)" "cat*dog)+dog)" "bird*dog)+dog)" "cat)/dog)+dog)" "bird)/dog)+dog)"
额外需求
除了实现上述运算组合生成功能,我也愿意尝试能直接完成「寻找最优变量组合建模」的机器学习包,或者更直接用于线性模型的替代方案。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

