R语言带位置约束的排列生成问题:如何限定不同列的可选取值范围
解决方案
直接分步骤生成符合约束的两部分排列后合并即可,不会生成冗余数据,完全避免过滤步骤:
实现代码
# 加载依赖包 library(gtools) # 定义两组可选值 blatt_opts <- c("come_in-blatt-1", "come_in-blatt-2") front_opts <- c("come_in-front-1", "come_in-front-2") # 生成前2列的所有可重复排列 part1 <- permutations(n = length(blatt_opts), r = 2, v = blatt_opts, repeats.allowed = TRUE) # 生成第3到11列共9列的所有可重复排列 part2 <- permutations(n = length(front_opts), r = 9, v = front_opts, repeats.allowed = TRUE) # 合并两部分为全量符合要求的排列:两部分做笛卡尔积 n1 <- nrow(part1) n2 <- nrow(part2) result <- cbind( part1[rep(1:n1, each = n2), ], part2[rep(1:n2, times = n1), ] ) # 重命名列名和常规输出逻辑保持一致 colnames(result) <- paste0("V", 1:ncol(result)) # 导出csv write.csv(result, file = "result-test3.csv", row.names = FALSE) # 打开文件(Windows系统如果命令报错可以直接手动打开文件) system("open result-test3.csv")
逻辑说明
- 前2列仅从
blatt_opts的2个值中生成可重复排列,共2^2=4种组合 - 后9列仅从
front_opts的2个值中生成可重复排列,共2^9=512种组合 - 两部分做全量组合后总共生成4*512=2048行符合要求的结果,相比原先生成4^11=4194304行再过滤的方案,资源占用降低99.95%,即使后续排列长度扩展也不会产生额外无效数据。
内容的提问来源于stack exchange,提问作者user259666
相关产品推荐
相关产品推荐

