R:所有排列的前 N ​​个

2023-12-30

我正在寻找一个函数

  • 可以列出所有n!给定输入向量的排列(通常只是序列1:n)
  • 也可以只列出所有 n 中的前 N!排列

第一个要求得到满足,例如permn()从包装中combinat, permutations()从包装中e1071, or permutations()从包装中gtools。但是,我确信某个包中还有另一个功能也提供了第二个功能。我用过一次,但后来忘记了它的名字。

编辑: “前 N”的定义是任意的:该函数只需要一个始终遵循的内部枚举方案,并且应该在计算 N 个排列后中断。

正如 Spacedman 正确指出的那样,函数计算的排列数量不要超过实际需要的数量(以节省时间),这一点至关重要。

编辑-解决方案:我记得我正在使用什么,它是numperm()从包装中sna. numperm(4, 7)给出元素的第 7 个排列1:4,对于前 N 个,必须循环。


解决这个问题的最佳方法似乎是构建一个iterator可以生成排列列表,而不是使用类似的函数permn它预先生成整个列表(一个昂贵的操作)。

寻找构建此类对象的指导的一个很好的地方是迭代工具 http://docs.python.org/library/itertools.htmlPython 标准库中的模块。 Itertools 已针对 R 部分重新实现为同名的包 http://crantastic.org/packages/itertools.

下面是一个使用 R 的 itertools 实现 Python 生成器端口的示例,该生成器为排列创建迭代器:

require(itertools)

permutations <- function(iterable) {
  # Returns permutations of iterable. Based on code given in the documentation
  # of the `permutation` function in the Python itertools module:
  #   http://docs.python.org/library/itertools.html#itertools.permutations
  n <- length(iterable)
  indicies <- seq(n)
  cycles <- rev(indicies)
  stop_iteration <- FALSE

  nextEl <- function(){
    if (stop_iteration){ stop('StopIteration', call. = FALSE) }
    if (cycles[1] == 1){ stop_iteration <<- TRUE } # Triggered on last iteration

    for (i in rev(seq(n))) {
      cycles[i] <<- cycles[i] - 1
      if ( cycles[i] == 0 ){
        if (i < n){
          indicies[i:n] <<- c(indicies[(i+1):n], indicies[i])
        }
        cycles[i] <<- n - i + 1
      }else{
        j <- cycles[i]
        indicies[c(i, n-j+1)] <<- c(indicies[n-j+1], indicies[i])
        return( iterable[indicies] )
      }
    }
  }

  # chain is used to return a copy of the original sequence 
  # before returning permutations. 
  return( chain(list(iterable), new_iterator(nextElem = nextEl)) )

}

错误引用Knuth http://en.wikiquote.org/wiki/Donald_Knuth:“小心上面代码中的错误;我只是尝试过,没有证明它是正确的。”

对于序列的前 3 个排列1:10, permn为计算不必要的排列付出沉重的代价:

> system.time( first_three <- permn(1:10)[1:3] )
   user  system elapsed 
134.809   0.439 135.251 
> first_three
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1]  1  2  3  4  5  6  7  8 10  9

[[3]]
 [1]  1  2  3  4  5  6  7 10  8  9)

但是,返回的迭代器permutations只能查询前三个元素,这样可以节省大量计算:

> system.time( first_three <- as.list(ilimit(permutations(1:10), 3)) )
   user  system elapsed 
  0.002   0.000   0.002 
> first_three
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1]  1  2  3  4  5  6  7  8 10  9

[[3]]
 [1]  1  2  3  4  5  6  7  9  8 10

Python 算法确实以不同的顺序生成排列permn.

计算所有排列仍然是可能的:

> system.time( all_perms <- as.list(permutations(1:10)) )
   user  system elapsed 
498.601   0.672 499.284

尽管与 Python 算法相比,由于大量使用循环,成本要高得多permn。 Python 实际上用 C 语言实现了这个算法,弥补了解释循环的低效率。

代码可用GitHub 上的要点 https://gist.github.com/832723。如果有人有更好的想法,请离开!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:所有排列的前 N ​​个 的相关文章

  • 计算一列中正数和负数的数量

    我想计算数据帧的一列中正值和负值的数量 我在 R 中该怎么做 例如 这里是数据框 logFC logCPM LR PValue FDR Bra15066 5 630822 5 184586 73 79927 8 647868e 18 4 0
  • LaTex 中与 knit 和 xtable 交叉引用的问题

    我目前正在与 R Studio 合作 使用 LaTex 中的 R knitr 生成 PDF 文档 在这些文档中 我想在文本中引用的表格中展示我的部分结果 我使用 R 中的 xtable 包生成这些表 它运行良好并为我提供了正确的表 到目前为
  • 使用 R Shiny 从 XLConnect 下载 Excel 文件

    有没有人尝试过使用 R Shiny 中的下载处理程序通过 XLConnect 下载新创建的 Excel 文件 在 ui R 中有一行不起眼的行 downloadButton downloadData Download 在 server R
  • 替换列表列表中的元素

    The applyR 中的函数是简化 for 循环以获得输出的好方法 是否有一个等效的函数可以帮助人们在替换向量的值时避免 for 循环 通过示例可以更好地理解这一点 Take this list for example x list li
  • 将命名参数列表传递给函数?

    我想编写一个小函数来从适当的分布生成样本 例如 makeSample lt function n dist params values lt makeSample 100 unif list min 0 max 10 values lt m
  • 返回数据帧 R 中的下一行

    我有一个看起来像这样的数据框 kind datetime book 2016 04 23 04 23 00 pen 2016 04 23 04 30 00 toy 2016 04 23 06 45 00 我想为数据集中的每一行返回下一行的日
  • 如何对同一列上的数据帧列表中的所有数据帧进行排序?

    我有一个数据框列表dataframes list 举个例子 我把dput dataframes list 在底部 我想对列列表中的所有数据框进行排序enrichment 我可以对一个数据框进行排序 first dataframe lt da
  • .wav 文件长度/持续时间,无需读入文件

    有没有办法提取有关 wav 文件长度 持续时间的信息 而无需在 R 中读取文件 我有数千个这样的文件 如果我必须阅读每个文件才能找到其持续时间 那将需要很长时间 Windows 文件资源管理器为您提供了打开 长度 字段的选项 并且您可以查看
  • kableExtra 中的 row_spec() 函数不会在 html 输出中创建水平线

    我想在 kableextra 表中的某一行下方添加一条水平线 row spec 函数的参数 hline after 应该在行下方添加水平线 row spec 文档 https www rdocumentation org packages
  • 在 R 中创建一个运行计数变量?

    我有一个足球比赛结果的数据集 我希望通过创建一组类似于世界足球 Elo 公式的运行评级来学习 R 我遇到了麻烦 在 Excel 中看似简单的事情在 R 中并不完全直观 例如 4270 个观察中的前 15 个具有必要的变量 date t 1
  • 在 R 中绘制 Likert 变量的堆积条形图

    假设我有一个如下所示的数据框 P Q1 Q2 1 1 4 1 2 2 3 4 3 1 1 4 其中的列告诉我哪个人相应地回答了问题 q1 q2 中的哪一个 这些问题需要按照 4 分李克特量表进行回答 例如 批准 表示 1 稍微批准 表示 2
  • 从命令行运行 R 代码 (Windows)

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • 在 R 格子包中微调点图

    我正在尝试为不同的数据集和不同的算法绘制一堆 ROC 区域 我有三个变量 方案 指定所使用的算法 数据集 是正在测试算法的数据集 以及 Area under ROC 我正在 R 中使用lattice库 命令如下 点图 方案 Area und
  • 使用 R 选择第一个非 NA 值

    df lt data frame ID c 1 1 1 2 3 3 3 test c NA 5 5 6 4 NA 7 3 NA 10 9 我想创建一个名为 value 的变量 它是每个单独 ID 测试的第一个非 NA 值 对于只有NA的个体
  • R 中的列乘以子字符串

    假设我有一个数据框 其中包含多个组件及其在多个列中列出的属性 并且我想对这些列运行多个函数 我的方法是尝试将其基于每个列标题中的子字符串 但我无法弄清楚如何做到这一点 下面是数据框的示例 Basket F Type 1 F Qty 1 F
  • 朴素贝叶斯分类器仅基于先验概率做出决策

    我试图根据推文的情绪将推文分为三类 买入 持有 卖出 我正在使用 R 和包 e1071 我有两个数据框 一个训练集和一组需要预测情绪的新推文 训练集数据框 text sentiment this stock is a good buy Bu
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 6 个月 7 列 例如使用read table Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2009 41 27 25 31 31 39 2
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 基于时间窗口的不规则时间序列的优化滚动函数

    有没有办法使用 rollapply 来自zoo包或类似的东西 优化功能 rollmean rollmedian等 使用基于时间的窗口计算滚动函数 而不是基于大量观察的函数 我想要的很简单 对于不规则时间序列中的每个元素 我想计算一个具有 N
  • 将阴影区域添加到五分位数之间的直方图中

    All 我有一个包含 2 个直方图的图表 其中我还绘制了代表第 20 40 60 和 80 个百分位数的线条 下面的代码使用虚拟数据重现了类似的图表 data lt rbind data frame x rnorm 1000 0 1 g o

随机推荐

  • 显示 18 年前的日期选择器并锁定 ios 中的 ui 日期选择器

    在我的项目中 我需要显示 18 年前的日期选择器 并且需要锁定 80 年前的日期 所以我如何在日期选择器中显示这些日期 任何人都可以帮助我在这里找到 这里添加代码我在日志中打印的代码但我需要在我的日期选择器上显示所以我如何显示 NSCale
  • Rspec 未定义的局部变量或方法 root_path

    我开始使用 Rspec 但是当我运行时bundle exec rspec我收到一个错误 spec requests pages spec rb 20 in block 2 levels in
  • 如何从 /bin 目录中加载所有程序集

    在 Web 应用程序中 我想加载 bin 目录中的所有程序集 由于它可以安装在文件系统中的任何位置 因此我无法保证它存储的特定路径 我想要一个 Assembly 装配对象的 List 好吧 您可以使用以下方法自己将其组合在一起 最初使用类似
  • int 整数实例

    为什么当 Java 进行自动装箱时这是一个编译时错误 我错过了什么吗 int primitiveIntVariable 0 if primitiveIntVariable instanceof Integer I get Inconvert
  • 根据晚于特定日期的多列选择行

    我有以下数据框 import pandas as pd import numpy as np np random seed 0 create an array of 5 dates starting at 2015 02 24 one pe
  • ruby 中的一行可以动态初始化多个变量吗? [复制]

    这个问题在这里已经有答案了 我才写了几个星期的代码 这是我的第一个问题 所以请耐心等待 在 ruby 中 我知道您可以在一行上初始化多个变量 如下所示 a b 1 2 但是 我想知道是否可以在循环中初始化多个变量并生成它们的名称 这是一些伪
  • SVN:XML 格式错误错误

    我正在尝试从远程存储库签出分支 签出多个文件 然后签出失败并出现以下错误 svn E175009 XML 响应包含无效的 XML svn E130003 格式错误的 XML 格式不正确 令牌无效 是什么导致了这个问题 有没有办法修复远程存储
  • 如何查看公共数据集?

    我正在尝试按照 GitHub 网站上的说明查看 GitHub 公共数据集 那里的说明说 添加项目名称 githubarchive 但是在 BigQuery 网站上时 我看不到添加项目的方法 我确信我只是没有正确注册或类似的事情 但我不知道如
  • 检查是否设置了对象属性 - SimpleXML

    我有一些 XML 正在使用 PHP 的 SimpleXML 类 并且 XML 中有一些元素 例如
  • 将自定义视图添加到导航项后,自定义视图始终返回 nil

    下面的代码添加了一个自定义视图navigationItem成功了 但是当尝试访问时customView它总是会回来nil override func viewDidLoad super viewDidLoad let customView
  • os.path.join 和 os.sep 连接的使用差异

    我正在尝试弄清楚使用以下方法是否更好 os path join str1 str2 or str1 os sep str2 分析与timeit我发现 正如预期的那样 串联速度更快 timeit playground os sep Text
  • 从 XPS 文档中提取单个页面

    我需要拆分现有的 XPS 文档并创建一个新的 XPS 文档 其中只有原始文档的一页 我尝试复制文档并从复制的文档中删除页面 但这非常慢 有没有更有效的方法来做到这一点 请使用 C Thanks 解决 public void Split st
  • 中断 D3.js 中的滚动转换

    我正在使用scrollama javascript 库编写一篇 scrolllytelling 文章 其中涉及当用户滚动时将D3 图形移入和移出视图 它大部分工作正常 但如果我滚动太快 图表就会堆积在一起 这是一个jsfiddle http
  • 编译关于缺少 @required 协议方法未出现的警告

    今天早上我正在修改 XCode 4 5 2 想要制作一个表格视图 我自然地添加了UITableViewDataSource and UITableViewDelegate我的视图控制器定义上的协议 import
  • 通过 Linux 终端运行 Java GUI 应用程序

    我在 Ubuntu 上尝试通过终端运行 Java GUI 应用程序 当我尝试运行它时 出现 HeadlessException 下面是堆栈跟踪 Exception in thread AWT EventQueue 0 java awt He
  • 清除本地存储但免除某些值。

    有没有办法清除 window localStorage 即window localStorage clear 但豁免某些键 值对 不 但您可以将所需的值保存在变量中 然后清除localStorage然后再次将存储在变量中的项目添加到其中 E
  • 查找总和等于“k”的子数组的数量

    我们将得到一个整数数组和一个值k 我们需要找到总和等于的子数组的总数k 我在网上 Leetcode 发现了一些有趣的代码 如下 public class Solution public int subarraySum int nums in
  • Scala Play 框架 Web 应用程序托管流程

    我正在使用 scala 和 play 框架从事一个网络项目 我担心应用程序部署部分 我需要在 Glass Fish 服务器中托管我的应用程序 那么有人有这方面的经验吗 我有托管 javaEE 应用程序将 war 文件上传到服务器的经验 但我
  • PHP 警告:unpack():类型 n:输入不足 - 日志条目

    所以我找到了这个错误日志 PHP Warning unpack Type n not enough input need 2 have 0 in file line 所述文件和行包含以下代码 answerHeader unpack ntyp
  • R:所有排列的前 N ​​个

    我正在寻找一个函数 可以列出所有n 给定输入向量的排列 通常只是序列1 n 也可以只列出所有 n 中的前 N 排列 第一个要求得到满足 例如permn 从包装中combinat permutations 从包装中e1071 or permu