如何计算R中的组合和排列?
Posted
技术标签:
【中文标题】如何计算R中的组合和排列?【英文标题】:How to calculate combination and permutation in R? 【发布时间】:2011-12-15 22:05:01 【问题描述】:如何计算 R 中组合和排列的数量?
Combinations package 在 Linux 上安装失败,并显示以下消息:
> install.packages("Combinations")
Installing package(s) into ‘/home/maxim/R/x86_64-pc-linux-gnu-library/2.13’
(as ‘lib’ is unspecified)
Warning message:
In getDependencies(pkgs, dependencies, available, lib) :
package ‘Combinations’ is not available (for R version 2.13.1)
【问题讨论】:
为什么关闭?它不是在寻求有关书籍或软件库的推荐,而是在特定语言中计算组合函数。 Python、C 和其他语言的等效问题未关闭... 我编辑了问题以删除软件推荐的提及。鉴于高质量的答案(以及 cmets 中的有用讨论),我认为应该重新提出这个问题。 【参考方案1】:函数combn在标准的utils包中(即已经安装)
choose 也已在 Special base 中提供
【讨论】:
对于一个简单的问题,它的答案是 3 个词“选择功能”,真是麻烦了 选择(n,k) = nCk【参考方案2】:如果你不希望你的代码依赖于其他包,你总是可以只写这些函数:
perm = function(n, x)
factorial(n) / factorial(n-x)
comb = function(n, x)
factorial(n) / factorial(n-x) / factorial(x)
【讨论】:
这在数字上是个坏主意。 R 可以评估choose(500, 2)
,但不能评估factorial(500)
。您至少应该使用lfactorial
,然后使用exp()
。我发布这个的唯一原因是你的答案有很多赞成,似乎人们不知道这些事情......【参考方案3】:
您可以将combinat
包与 R 2.13 一起使用:
install.packages("combinat")
require(combinat)
permn(3)
combn(3, 2)
如果您想知道组合/排列的数量,请检查结果的大小,例如:
length(permn(3))
dim(combn(3,2))[2]
【讨论】:
有没有什么东西可以给我一些可能的组合,而不是全部打印出来? @MaximVeksler 看看choose
。 (choose(5, 2) == ncol(combn(5, 2))
)
此站点可用作备用站点:englishact.com/Permutation/index.php【参考方案4】:
Combinations
包不是标准 CRAN 包集的一部分,而是不同存储库 omegahat 的一部分。要安装它,您需要使用
install.packages("Combinations", repos = "http://www.omegahat.org/R")
请参阅http://www.omegahat.org/Combinations/ 的文档
【讨论】:
这也行不通,我认为我使用的R版本是(2.13)不兼容 啊,有错字;它应该是omegahat,而不是omegahat。我复制并粘贴了命令,但我应该先对其进行测试。我已经更新了我的答案。此更新后的代码适用于 Windows 上的 2.13.2。【参考方案5】:可能是“组合”包不再更新,并且不适用于最新版本的 R(我也无法在 Windows 上的 R 2.13.1 上安装它)。 包“combinat”安装对我来说没有问题,可能是你的解决方案,具体取决于你想要做什么。
【讨论】:
【参考方案6】:上面的几个解决方案涉及旨在列出实际组合的函数,然后应用长度函数来执行计算。如果您只想要数字,这是非常低效的。 ncol(combn(1:70,5)) 在我的系统中使用 rstudio.cloud 大约需要 10 秒。 choose(70,5) 不到一秒。
正如 Marius Hofert 指出的那样,阶乘 (500) 等表达式在数值上存在问题。
在不使用非标准库的情况下,我相信 choose(n,k) 是组合的最佳解决方案。我所知道的最好的排列是选择(n,k)*阶乘(k),但如果有人知道获得排列的直接方法,请分享。
【讨论】:
以上是关于如何计算R中的组合和排列?的主要内容,如果未能解决你的问题,请参考以下文章