6 个位置内 3 个元素的排列

2024-01-11

我正在寻找排列(或组合)c("a","b","c")在始终具有具有替代元素的序列的条件下的六个位置内,例如abcbab.

排列可以很容易地得到:

abc<-c("a","b","c")
permutations(n=3,r=6,v=abc,repeats.allowed=T)

我认为使用 gtools 不可能做到这一点,并且我一直在尝试为此设计一个函数 - 尽管我认为它可能已经存在。


既然你正在寻找排列,expand.grid也可以工作permutations。但由于你不需要相似的邻居,我们可以大大缩短它的维数。我think这是合法的随机明智的!

前面:

r <- replicate(6, seq_len(length(abc)-1), simplify=FALSE)
r[[1]] <- c(r[[1]], length(abc))
m <- t(apply(do.call(expand.grid, r), 1, cumsum) %% length(abc) + 1)
m[] <- abc[m]
dim(m)
# [1] 96  6
head(as.data.frame(cbind(m, apply(m, 1, paste, collapse = ""))))
#   Var1 Var2 Var3 Var4 Var5 Var6     V7
# 1    b    c    a    b    c    a bcabca
# 2    c    a    b    c    a    b cabcab
# 3    a    b    c    a    b    c abcabc
# 4    b    a    b    c    a    b babcab
# 5    c    b    c    a    b    c cbcabc
# 6    a    c    a    b    c    a acabca

演练:

  • 因为你想要它的所有回收排列,我们可以使用gtools::permutations,或者我们可以使用expand.grid...我将使用后者,我不知道它是否更快,但它确实是我需要的捷径(稍后会详细介绍)
  • 在处理这样的约束时,我喜欢扩展值向量的索引
  • 然而,由于我们不希望邻居相同,我认为我们不是将每行值作为直接索引,而是cumsum他们;通过使用这个,我们可以控制累积和重新达到相同值的能力......通过删除0 and length(abc)从可能值列表中,我们消除了以下可能性:(a) 永远不会保持不变,以及 (b) 永远不会实际增加一个向量长度(重复相同的值);作为演练:

    head(expand.grid(1:3, 1:2, 1:2, 1:2, 1:2, 1:2), n = 6)
    #   Var1 Var2 Var3 Var4 Var5 Var6
    # 1    1    1    1    1    1    1
    # 2    2    1    1    1    1    1
    # 3    3    1    1    1    1    1
    # 4    1    2    1    1    1    1
    # 5    2    2    1    1    1    1
    # 6    3    2    1    1    1    1
    

    由于第一个值可以是所有三个值,因此1:3,但每个附加值都与它相差 1 或 2。

    head(t(apply(expand.grid(1:3, 1:2, 1:2, 1:2, 1:2, 1:2), 1, cumsum)), n = 6)
    #      Var1 Var2 Var3 Var4 Var5 Var6
    # [1,]    1    2    3    4    5    6
    # [2,]    2    3    4    5    6    7
    # [3,]    3    4    5    6    7    8
    # [4,]    1    3    4    5    6    7
    # [5,]    2    4    5    6    7    8
    # [6,]    3    5    6    7    8    9
    

    好吧,这似乎没那么有用(因为它超出了向量的长度),所以我们可以调用模运算符和移位(因为模返回从 0 开始,我们想要从 1 开始):

    head(t(apply(expand.grid(1:3, 1:2, 1:2, 1:2, 1:2, 1:2), 1, cumsum) %% 3 + 1), n = 6)
    #      Var1 Var2 Var3 Var4 Var5 Var6
    # [1,]    2    3    1    2    3    1
    # [2,]    3    1    2    3    1    2
    # [3,]    1    2    3    1    2    3
    # [4,]    2    1    2    3    1    2
    # [5,]    3    2    3    1    2    3
    # [6,]    1    3    1    2    3    1
    
  • 为了验证这一点,我们可以做一个diff遍历每一行并寻找0:

    m <- t(apply(expand.grid(1:3, 1:2, 1:2, 1:2, 1:2, 1:2), 1, cumsum) %% 3 + 1)
    any(apply(m, 1, diff) == 0)
    # [1] FALSE
    
  • to automate这是一个任意向量,我们寻求帮助replicate生成可能向量的列表:

    r <- replicate(6, seq_len(length(abc)-1), simplify=FALSE)
    r[[1]] <- c(r[[1]], length(abc))
    str(r)
    # List of 6
    #  $ : int [1:3] 1 2 3
    #  $ : int [1:2] 1 2
    #  $ : int [1:2] 1 2
    #  $ : int [1:2] 1 2
    #  $ : int [1:2] 1 2
    #  $ : int [1:2] 1 2
    

    进而do.call来扩展它。

  • 你有一个索引矩阵,

    head(m)
    #      Var1 Var2 Var3 Var4 Var5 Var6
    # [1,]    2    3    1    2    3    1
    # [2,]    3    1    2    3    1    2
    # [3,]    1    2    3    1    2    3
    # [4,]    2    1    2    3    1    2
    # [5,]    3    2    3    1    2    3
    # [6,]    1    3    1    2    3    1
    

    然后用向量的值替换每个索引:

    m[] <- abc[m]
    head(m)
    #      Var1 Var2 Var3 Var4 Var5 Var6
    # [1,] "b"  "c"  "a"  "b"  "c"  "a" 
    # [2,] "c"  "a"  "b"  "c"  "a"  "b" 
    # [3,] "a"  "b"  "c"  "a"  "b"  "c" 
    # [4,] "b"  "a"  "b"  "c"  "a"  "b" 
    # [5,] "c"  "b"  "c"  "a"  "b"  "c" 
    # [6,] "a"  "c"  "a"  "b"  "c"  "a" 
    
  • 然后我们cbind联合字符串(通过apply and paste)


表现:

library(microbenchmark)
library(dplyr)
library(tidyr)
library(stringr)

microbenchmark(
  tidy1 = {
    gtools::permutations(n = 3, r = 6, v = abc, repeats.allowed = TRUE) %>% 
      data.frame() %>% 
      unite(united, sep = "", remove = FALSE) %>%
      filter(!str_detect(united, "([a-c])\\1"))
  },
  tidy2 = {
      filter(unite(data.frame(gtools::permutations(n = 3, r = 6, v = abc, repeats.allowed = TRUE)),
                   united, sep = "", remove = FALSE),
             !str_detect(united, "([a-c])\\1"))
  },
  base = {
    r <- replicate(6, seq_len(length(abc)-1), simplify=FALSE)
    r[[1]] <- c(r[[1]], length(abc))
    m <- t(apply(do.call(expand.grid, r), 1, cumsum) %% length(abc) + 1)
    m[] <- abc[m]
  },
  times=10000
)
# Unit: microseconds
#   expr      min        lq     mean   median       uq       max neval
#  tidy1 1875.400 2028.8510 2446.751 2165.651 2456.051 12790.901 10000
#  tidy2 1745.402 1875.5015 2284.700 2000.051 2278.101 50163.901 10000
#   base  796.701  871.4015 1020.993  919.801 1021.801  7373.901 10000

我尝试了中缀(非%>%) tidy2 版本只是为了好玩,虽然我相信理论上它会更快,但我没有意识到它会减少超过 7% 的运行时间。 (50163 可能是 R 垃圾收集,而不是“真实的”。)我们为可读性/可维护性付出的代价。

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

6 个位置内 3 个元素的排列 的相关文章

  • 在 R 中创建虚拟变量,排除某些情况为 NA

    我的数据看起来像这样 V1 V2 A 0 B 1 C 2 D 3 E 4 F 5 G 9 我想创建一个虚拟变量R where 0 1 1 2 3 4 and NA 0 5 9 应该很简单 有人可以帮忙吗 我们可以转换V2 into a fa
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 使用 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
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 旋转 Markdown 的表格 pdf 输出

    我想将 pdf 上的表格输出旋转 90 度 我正在使用 Markdown 生成报告并kable循环显示表格 如果可以的话我想继续使用kable因为还有很多其他依赖于它的东西我没有包含在这个 MWE 中 这是一个简单的例子 使用iris数据集
  • 如何获得所有大于x且有位置的数字?

    V lt c 1 3 2 4 2 3 1 X lt 3 pos lt V V X pos is 3 3 我需要的是所有 3 个的位置 I need 2 and 6 哪些职位是3 in V Use which pos lt which V 3
  • 在 Rcpp 中使用其他包中的 C 函数

    我试图从 C 函数中的 cubature 包调用 C 例程来执行多维积分 我试图重现的基本 R 示例是 library cubature integrand lt function x sin x adaptIntegrate integr
  • 如何在 R 或 Python 中制作旭日图?

    到目前为止 我一直无法找到一个可以创建旭日图的 R 库约翰 斯塔斯科 http www cc gatech edu gvu ii sunburst 有人知道如何在 R 或 Python 中实现这一点吗 在极坐标投影中使用 matplotli
  • 如何从 R 中的 txt 文件读取矩阵?

    我有一个带有矩阵的txt文件 Matrix txt 重要 数字之间没有空格 0100 1001 1100 我想在 R 中将其作为矩阵读取 我该怎么做 我尝试使用 as matrix read table Matrix txt sep 但失败
  • 如何使用 SparkR 1.6.0 写入 JDBC 源?

    使用 SparkR 1 6 0 我可以使用以下代码从 JDBC 源读取数据 jdbc url lt jdbc mysql localhost 3306 dashboard user
  • R“错误:“}”中出现意外的“}”[重复]

    这个问题在这里已经有答案了 我有一个字符串变量 对于缺少数据的情况 它具有 空值 我想将 空值 重新编码为缺失 而不是说 空值 我正在尝试编写一个循环来删除这些 空值 条目 但我不断收到错误 错误 中出现意外的 for row in dat
  • 以编程方式将字符串宽度值插入到 sprintf() 中

    我正在尝试以编程方式将字符串宽度值插入到sprintf 格式 期望的结果是 sprintf 20s hello 1 hello 但我想插入20在同一通话中即时进行 因此它可以是任何号码 我努力了 sprintf ds 20 hello 1
  • applyStrategy 错误

    我是R新手 最近运行后遇到以下错误applyStrategy函数来自quantstrat包裹 Error in eval expr envir enclos object signal not found Error in colnames
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • 闭包作为数据合并习惯的解决方案

    我正在尝试解决闭包问题 而且我think我发现了一个案例 他们可能会有所帮助 我有以下几部分需要处理 一组正则表达式 旨在清理状态名称 位于函数中 具有州名称 上述函数创建的标准化形式 和州 ID 代码的 data frame 用于链接两者
  • 线性判别分析图

    如何将样本 ID 行号 作为标签添加到此 LDA 图中的每个点 library MASS ldaobject lt lda Species data iris plot ldaobject panel function x y points

随机推荐

  • Shell 脚本调试帮助 - 遍历目录中的文件

    bin sh files ls myDir myDir2 myDir3 for file in files do echo file java myProg file another directory done 我想做的是迭代 myDir
  • Delphi 中的任何 Asn1 实现

    Delphi 中是否有任何不错的 asn1 实现或库 Try StreamSec ASN 1 工具 http www streamsec com products stasn1 asp 它们也出现在合作伙伴 DVD 中
  • 当值相等时,Angular 和 NGRX 防止选择器在状态更改时发出相同的值

    我正在寻找一种解决方案 使我的选择器仅在与上次发出的值相比发生变化时才发出新值 而不仅仅是对商店的引用发生变化 我的商店有以下状态 items loading false selectedItemId 1 我有以下选择器 export co
  • 填补D3数组嵌套的空白

    我有一个由日期和一些值组成的数组或对象 var flatData date 2012 05 26 product apple date 2012 07 03 product orange 我正在尝试使用 d3 nest 按年然后按月获取这些
  • appcompat_v7 和fragment_main.xml?

    我最近将 eclipse 和 ADT 插件从 v22 3 更新到 v22 6 并发现了一些重大变化 每当我创建一个新的 Android 应用程序项目时 都会出现一个新的 appcompat v7 库 该库在 v22 3 插件上不存在 并且还
  • jQuery / DataTables:如何更改分页颜色

    我正在使用 jQuery DataTables 插件 版本 1 9 4 并且想更改分页的颜色 使用 CSS 我可以更改它们的背景颜色 但我找不到更改锚标记的字体颜色和字体悬停颜色的方法 我想将以下所有锚标记的字体颜色和悬停字体颜色更改为白色
  • OpenAI:流中断(客户端断开连接)

    我正在尝试 OpenAI 我已经准备好了训练数据 并使用fine tunes create 几分钟后 显示Stream interrupted client disconnected openai api fine tunes create
  • 使用参数设置 Jenkins Pipeline 构建

    我阅读了大量有关 Jenkins 2 x 和管道系统的内容 以便创建具有以下功能的设置 SCM 管理 Jenkinsfile 构建对 git 存储库的每个提交 通过 webhook 触发器传递参数 到目前为止 由于各种原因 我未能建立一个工
  • 如何在asp.net MVC视图中有条件地设置模型?

    我是 ASP NET MVC 的初学者 我的页面有一个名为 Navigation 的部分视图 我正在重复使用它 如果用户位于 主页 a 导航的 href 需要指向 字符 如果用户位于 服务 页面 则导航的 href 需要指向其他 url 例
  • 如何VBA捕获请求超时错误?

    我正在使用对象MSXML2 ServerXMLHTTP60 http msdn microsoft com en us library ms762278 28v vs 85 29向网络服务发送请求 有了这个对象 我可以通过以下方式加快数据加
  • Safari 扩展截屏

    我正在开发 Safari 浏览器扩展 它应该具有截图功能 Chrome 和 Firefox 有自己的 api 来获取当前窗口文档的 SS 我找不到任何特定于 Safari 的 API 文档 窗口和选项卡 API https develope
  • RGB 颜色不正确 Unity C#

    所以我有一个 2D 对象 您可以使用按钮更改颜色 每个按钮都会更改对象的精灵 我有一个红色 橙色 黄色 绿色 蓝色 紫色的精灵 现在我有一个粒子系统 前面提到的对象的子对象 我想将其 startColor 属性更改为与 2D 对象的精灵相同
  • Scipy.cluster.hierarchy.fclusterdata + 距离测量

    1 我正在使用 scipy 的 hcluster 模块 所以我可以控制的变量是阈值变量 我如何知道每个阈值的表现 即在 Kmeans 中 该性能将是所有点到其质心的总和 当然 这必须进行调整 因为通常更多的簇 更短的距离 我可以用 hclu
  • TortoiseMerge 中的等号是什么意思?

    In TortoiseMerge 文档 http tortoisesvn net docs release TortoiseMerge en tmerge dug icons html 等号的意思是 通过恢复到该行的原始内容 已撤消更改 该
  • 对 AngularJS $window 服务进行单元测试

    我想对以下 AngularJs 服务进行单元测试 factory httpResponseInterceptor q location window CONTEXT PATH function q location window conte
  • Sencha Touch 2 事件:绘制与展示?

    我有一个关于show事件 在我的应用程序中我正在处理painted我的小组的事件是这样的 Ext define mvcTest controller Test extend Ext app Controller config refs pa
  • 在 ie 8 中打印浮点图

    我目前正在使用http www flotcharts org http www flotcharts org 对于一个绘图插件 我正在尝试实现从内容包围的页面上打印流程图的能力 我正在尝试打开一个新窗口并打印一个画布对象 这样我就可以只打印
  • 更改方法重写中的参数修饰符

    我知道一个params修饰符 将数组类型的一个参数转换为所谓的 参数数组 特别不是方法签名的一部分 现在考虑这个例子 class Giraffid public virtual void Eat int leaves Console Wri
  • 如何让 Django-Ajax-Selects 在 Django Admin 中工作?

    Django Ajax 选择 http code google com p django ajax selects 这是我所做的 但无济于事 Added ajax select to my INSTALLED APPS in setting
  • 6 个位置内 3 个元素的排列

    我正在寻找排列 或组合 c a b c 在始终具有具有替代元素的序列的条件下的六个位置内 例如abcbab 排列可以很容易地得到 abc lt c a b c permutations n 3 r 6 v abc repeats allow