R A、A、A、B、B、B、B、B的唯一组合的问题编号
我试图找到一种方法,在R中列出所有可能的唯一排列a,a,a,a,B,B,B,BR A、A、A、B、B、B、B、B的唯一组合的问题编号,r,combinations,R,Combinations,我试图找到一种方法,在R中列出所有可能的唯一排列a,a,a,a,B,B,B,B 组合最初被认为是获得解的方法,因此组合就是答案 我想这就是你想要的@比尔提出了将unique和combn相结合的建议。我们还将使用apply族生成所有组合。由于unique删除了重复的行,因此我们需要在unique对其进行排序之前转置combn的结果。然后,在返回屏幕之前,我们将它们转换回原来的位置,以便每列代表一个唯一的答案 #Daters x <- c(rep("A", 4), rep("B",5)) #G
组合最初被认为是获得解的方法,因此组合就是答案 我想这就是你想要的@比尔提出了将
unique
和combn
相结合的建议。我们还将使用apply族生成所有组合。由于unique
删除了重复的行,因此我们需要在unique
对其进行排序之前转置combn
的结果。然后,在返回屏幕之前,我们将它们转换回原来的位置,以便每列代表一个唯一的答案
#Daters
x <- c(rep("A", 4), rep("B",5))
#Generates a list with ALL of the combinations
zz <- sapply(seq_along(x), function(y) combn(x,y))
#Filter out all the duplicates
sapply(zz, function(z) t(unique(t(z))))
编辑因为问题是关于置换而不是组合,所以上面的答案没有那么有用。在给定一组参数的情况下,概述了生成唯一置换的函数。我不知道它是否可以改进,但这里有一种使用该功能的方法:
fn_perm_list <-
function (n, r, v = 1:n)
{
if (r == 1)
matrix(v, n, 1)
else if (n == 1)
matrix(v, 1, r)
else {
X <- NULL
for (i in 1:n) X <- rbind(X, cbind(v[i], fn_perm_list(n -
1, r - 1, v[-i])))
X
}
}
zz <- fn_perm_list(9, 9)
#Turn into character matrix. This currently does not generalize well, but gets the job done
zz <- ifelse(zz <= 4, "A", "B")
#Returns 126 rows as indicated in comments
unique(zz)
fn_perm_list不需要生成置换,然后选择唯一的置换。
这里有一个简单得多的方法(也快得多):要生成4a和5b的所有排列,我们只需要列举将4a放置在9个可能位置中的所有可能方法。这只是一个组合问题。我们可以这样做:
x <- rep('B',9) # vector of 9 B's
a_pos <- combn(9,4) # all possible ways to place 4 A's among 9 positions
perms <- apply(a_pos, 2, function(p) replace(x,p,'A')) # all desired permutations
也许您想要的是?combn
?很好的开始,但是combn函数要求您一次选择m。我只是在寻找上面字符串的所有唯一组合……不是子集。也许我也没有想到这一点。你可以尝试一下?unique
和?combn
。明白了。你的问题-仍然以combn思维方式思考,combn(x,2)
返回的值都是A
被认为是多余的吗?这和我在这里所做的是错误的组合排列吗。在这种情况下,顺序很重要,在那种情况下,我相信有9个/(4!*5!)=126种不同的aabbb排列。置换的一些例子有:aaabbbba、aaabbbab、aaabbbbabb、aaaabbabbbb等等。我们可以修改代码追踪以达到目的吗?@RyanB-更新答案以回应您的评论。我引用的链接中似乎有一些很好的信息,这些信息可能比我抓取的函数更有效。@RyanB-你也可以用这些信息和标题更新你的问题。@RyanB:如果Chase找到了,请选择他的答案,以便其他人更容易看到。
x <- rep('B',9) # vector of 9 B's
a_pos <- combn(9,4) # all possible ways to place 4 A's among 9 positions
perms <- apply(a_pos, 2, function(p) replace(x,p,'A')) # all desired permutations
> dim(perms)
[1] 9 126
> perms[,1:4] ## look at first few columns
[,1] [,2] [,3] [,4]
[1,] "A" "A" "A" "A"
[2,] "A" "A" "A" "A"
[3,] "A" "A" "A" "A"
[4,] "A" "B" "B" "B"
[5,] "B" "A" "B" "B"
[6,] "B" "B" "A" "B"
[7,] "B" "B" "B" "A"
[8,] "B" "B" "B" "B"
[9,] "B" "B" "B" "B"