R:组合学,一种组合的排列数

标签 r combinations permutation combinatorics

我有三个不同的事件 (1,2,3),具有不同的概率 (0.15, 0.76, 0.09),我想通过替换抽取 5 次。 我现在可以使用确定可能的组合数量

nsimplex(3,5)  ### =21

来自组合包。 我可以使用

确定每个组合的概率
mySimplex <- xsimplex(3,5)
myProbs<-c(0.15, 0.76, 0.09)
results<- apply(mySimplex,2,dmultinom,prob=myProbs)

此外,我当然可以通过计算 3^5= 243 来确定排列数。

但是,如果不手动计算同一组合的每个排列,我如何知道绘制它们的频率呢?也就是说,我的每个组合中有多少种排列?

如果我理解正确的话,有 243 种排列可以构建 21 种不同的组合。现在我的问题是,每个组合有多少种排列。例如。组合 {1,1,1,1,1} 将仅构建一次,而其他组合则通过多次排列创建。

我想你可以通过使用每个组合的概率来实现这一点,但我不知道该怎么做?或者有没有其他方法可以在 R 中轻松确定这一点? 预先感谢您。

最佳答案

项目 1 的 a 个不可区分副本、项目 2 的 b 和项目 3 的 c 的排列数量,其中 a + b + c = N,是N!/(a!b!c!)

例如,如果您有 (a,b,c) = (3,1,1) 则有 5!/(3!1!1!) = 20 安排。

  c  b  a  a  a    b  a  c  a  a    a  b  a  a  c    a  a  c  a  b    
  c  a  b  a  a    b  a  a  c  a    a  c  b  a  a    a  a  b  c  a    
  c  a  a  b  a    b  a  a  a  c    a  c  a  b  a    a  a  b  a  c    
  c  a  a  a  b    a  b  c  a  a    a  c  a  a  b    a  a  a  b  c    
  b  c  a  a  a    a  b  a  c  a    a  a  c  b  a    a  a  a  c  b  

一般来说,我们可以这样计算:

nperm<-function(...) {
   args<-as.numeric(list(...));
   num<-lfactorial(sum(args));
   den<-sum(lfactorial(args));
   return(round(exp(num-den)));
}

所以,例如,

x<-expand.grid(0:5,0:5,0:5)
x<-x[rowSums(x)==5,]
x[,"nperm"]<-apply(x,1,function(x) do.call(nperm,as.list(x)))

Var1 Var2 Var3 nperm
   5    0    0     1
   4    1    0     5
   3    2    0    10
   2    3    0    10
   1    4    0     5
   0    5    0     1
   4    0    1     5
   3    1    1    20
   2    2    1    30
   1    3    1    20
   0    4    1     5
   3    0    2    10
   2    1    2    30
   1    2    2    30
   0    3    2    10
   2    0    3    10
   1    1    3    20
   0    2    3    10
   1    0    4     5
   0    1    4     5
   0    0    5     1

sum(x[,"nperm"]) == 243,如预期。

关于R:组合学,一种组合的排列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952715/

相关文章:

image - 生成所有可能的 640 x 360 尺寸黑白像素图像的算法?

R将汇总结果(所有数据帧列的统计信息)转换为数据帧

r - 以尺寸图例 geom_point ggplot2 显示所有形状

python - 有没有办法在 itertools.combinations() 中找到 nᵗʰ 条目,而无需将整个内容转换为列表?

python - 字符替换组合与列表

python - 给定排列矩阵的 numpy 数组的每行(或列)的高效排列

r - 从 sendCustomMessage() 在 htmlwidgets/plotly 对象中定义悬停信息

r - 使用 dplyr::tbl 引用 PostgreSQL(振幅分析)表失败

java - 在java中生成List字符串的组合

functional-programming - Heaps算法在Scheme中的实现(排列生成)