我想生成两个向量的所有组合,给定两个约束:第一个向量中永远不能超过3个字符,并且第二个向量中必须始终至少有一个字符.我还想改变组合中的最终字符数.
例如,这里有两个向量:
vec1=c("A","B","C","D")
vec2=c("W","X","Y","Z")
Run Code Online (Sandbox Code Playgroud)
说我想在组合中使用3个字符.可能的可接受的排列是:"A" "B" "X"或"A" "Y" "Z".不可接受的排列是:"A" "B" "C"因为至少有一个字符来自vec2.
现在说我想要组合中的5个字符.可能的可接受的排列是:"A" "C" "Z" "Y"或"A" "Y" "Z" "X".一个不可接受的排列将是:"A" "C" "D" "B" "X"因为有超过3个字符vec2.
我想我可以使用expand.grid生成所有组合,然后以某种方式子集,但必须有一个更简单的方法.提前致谢!
我不确定这更容易,但你可以放弃那些不符合你的条件的排列:
生成所有vec1可接受的组合.
生成所有vec2可接受的组合.
生成所有组合,从1. +一个解决方案中获取一个解决方案.这里我将使用条件3进行过滤.
(如果你正在寻找组合,你就完成了,否则:)产生每个结果中所有字母的排列.
现在,让我们拥有
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))
Run Code Online (Sandbox Code Playgroud)
现在我们有:
> 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]
Run Code Online (Sandbox Code Playgroud)
所以你在这里:
> 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"
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢将结果拆分为单个字母:
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"
Run Code Online (Sandbox Code Playgroud)
(剪断)
[51,] "C" "W" "X" "Y" "Z"
[52,] "D" "W" "X" "Y" "Z"
Run Code Online (Sandbox Code Playgroud)
你的组合是什么?