R - 在给定约束的情况下从 2 个向量生成所有组合

标签 r combinations

我想在给定两个约束的情况下生成两个向量的所有组合:第一个向量中的字符永远不能超过 3 个,并且第二个向量中必须始终至少有一个字符。我还想改变组合中的最终字符数。

例如,这里有两个向量:

vec1=c("A","B","C","D")
vec2=c("W","X","Y","Z")

假设我想要组合中的 3 个字符。可能可接受的排列是:“A”“B”“X”“A”“Y”“Z”。一种 Not Acceptable 排列是:"A""B""C",因为 vec2 中至少没有一个字符。

现在假设我想要组合中有 5 个字符。可能可接受的排列是:“A”“C”“Z”“Y”“A”“Y”“Z”“X”。 Not Acceptable 排列是:"A""C""D""B""X",因为 vec2 中有超过 3 个字符。

我想我可以使用expand.grid来生成所有组合,然后以某种方式生成子集,但必须有一种更简单的方法。提前致谢!

最佳答案

我不确定这是否更容易,但是您可以使用此策略放弃不满足您的条件的排列:

  1. vec1 生成所有可接受的组合。

  2. vec2 生成所有可接受的组合。

  3. 生成所有组合,采用 1 中的一种解决方案 + 2 中的一种解决方案。这里我将在之后使用条件 3 进行过滤。

  4. (如果您正在寻找组合,那么您就完成了,否则:)在每个结果中生成字母的所有排列。

现在,让我们来

vec1 <- LETTERS [1:4]
vec2 <- LETTERS [23:26]

## lists can eat up lots of memory, so use character vectors instead.
combine <- function (x, y) 
  combn (y, x, paste, collapse = "")

res1 <- unlist (lapply (0:3, combine, vec1))
res2 <- unlist (lapply (1:length (vec2), combine, vec2))

现在我们有:

> res1
 [1] ""    "A"   "B"   "C"   "D"   "AB"  "AC"  "AD"  "BC"  "BD"  "CD"  "ABC"
[13] "ABD" "ACD" "BCD"
> res2
 [1] "W"    "X"    "Y"    "Z"    "WX"   "WY"   "WZ"   "XY"   "XZ"   "YZ"  
[11] "WXY"  "WXZ"  "WYZ"  "XYZ"  "WXYZ"

res3 <- outer (res1, res2, paste0)
res3 <- res3 [nchar (res3) == 5]

所以你在这里:

> res3
 [1] "ABCWX" "ABDWX" "ACDWX" "BCDWX" "ABCWY" "ABDWY" "ACDWY" "BCDWY" "ABCWZ"
[10] "ABDWZ" "ACDWZ" "BCDWZ" "ABCXY" "ABDXY" "ACDXY" "BCDXY" "ABCXZ" "ABDXZ"
[19] "ACDXZ" "BCDXZ" "ABCYZ" "ABDYZ" "ACDYZ" "BCDYZ" "ABWXY" "ACWXY" "ADWXY"
[28] "BCWXY" "BDWXY" "CDWXY" "ABWXZ" "ACWXZ" "ADWXZ" "BCWXZ" "BDWXZ" "CDWXZ"
[37] "ABWYZ" "ACWYZ" "ADWYZ" "BCWYZ" "BDWYZ" "CDWYZ" "ABXYZ" "ACXYZ" "ADXYZ"
[46] "BCXYZ" "BDXYZ" "CDXYZ" "AWXYZ" "BWXYZ" "CWXYZ" "DWXYZ"

如果您希望将结果拆分为单个字母:

res <- matrix (unlist (strsplit (res3, "")), nrow = length (res3), byrow = TRUE)
> res
      [,1] [,2] [,3] [,4] [,5]
 [1,] "A"  "B"  "C"  "W"  "X" 
 [2,] "A"  "B"  "D"  "W"  "X" 
 [3,] "A"  "C"  "D"  "W"  "X" 
 [4,] "B"  "C"  "D"  "W"  "X" 

(剪断)

[51,] "C"  "W"  "X"  "Y"  "Z" 
[52,] "D"  "W"  "X"  "Y"  "Z" 

您的组合是哪些。

关于R - 在给定约束的情况下从 2 个向量生成所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10519836/

相关文章:

algorithm - 全组合树算法

Python:在文本文件中写入 pd.Series 的所有组合

linux - 如何聚合文件或合并

r - unique.data.table 选择最后一行代替第一行

python - 循环赛的分组列表组合

python - 从 n 个整数列表(可能长度不等)中进行所有可能的 n 长度排列

matlab - 如何使用向量化代码从 MATLAB 中的两个向量生成所有对?

r - 在 x 轴上的离散组之间添加刻度

r - ggplot 格式斜体注释

windows - 错误 : C stack usage is too close to the limit in Windows environment