【问题标题】:Is there an R function to get the number of permutations of n objects take k P(n,k)?是否有一个 R 函数来获取 n 个对象的排列数取 k P(n,k)?
【发布时间】:2011-02-21 17:46:39
【问题描述】:

..或者我必须给予

P.nk <- factorial(n) / factorial(n-k)

P.nk <- choose(n,k) * factorial(k)

谢谢。

【问题讨论】:

  • 正如其他人所说,gregmisc 中有一个直接排列函数(新解析的 gregmisc 包中的 gtools)。但是,我发现的所有其他包函数实际上是用于生成排列,而不仅仅是给出排列的总数。因此,它们往往很慢。我之前已经对这些功能进行了基准测试。您在这里的选项 2 是最快的,比我发现的任何包函数都要快得多。与您的第一个选项相比,它的计算上限也更高。
  • 感谢您提供有用的信息

标签: r permutation combinations


【解决方案1】:

我不知道任何现有的功能。您的第一个建议将因 n 大而失败。您的第二个想法在编写为函数时应该可以正常工作:

perm <- function(n,k){choose(n,k) * factorial(k)}

然后perm(500,2) 将给出例如 249500。

【讨论】:

  • 第一个建议可以重写为exp(lfactorial(n) - lfactorial(n-k))。但我也会用第二个。
【解决方案2】:

我认为gregmisc 包提供了这些功能。

library(gregmisc)
permutations(n=4,r=4)

邮件列表参考:[R] permutation

【讨论】:

  • 其实问的会是:dim(permutations(n,k))[1]
  • 包‘gregmisc’不可用(适用于 R 版本 3.5.3)2019 年 6 月 4 日
【解决方案3】:

查看“prob”包中的nsamp(n,k,ordered=T)

【讨论】:

  • nsamp(500,2,ordered=TRUE) Rob answer (value out of range) 中遇到问题状态。
  • > nsamp(173,2,ordered=TRUE) [1] NaN Warning messages: 1: In factorial(n[i]) : value out of range in 'gammafn' 2: In factorial(n[i] - k[i]) : value out of range in 'gammafn' > nsamp(171,2,ordered=TRUE) [1] Inf Warning message: In factorial(n[i]) : value out of range in 'gammafn' > nsamp(170,2,ordered=TRUE) [1] 28730 ----R版本3.5.3
【解决方案4】:

gtools

# R version 3.5.3
install.packages("gtools")
library(gtools)

base::nrow(gtools::permutations(500,2))

结果:

[1] 249500

另见combinations-and-permutations-in-rpermutation_with_replacement.R

另一个包prob:

base::ncol(prob::permsn(500,2))

[1] 249500

【讨论】:

  • 这些选项真的是用来生成排列的,所以如果你只需要排列的数量会很慢
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多