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 个元素的排列 的相关文章

随机推荐

  • 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