如何通过交换两个位置生成所有向量?

时间:2016-10-31 15:35:56

标签: r matrix combinations

假设我的列向量为[1 1 1 2 2 2 3 3 3],我想通过切换两个位置来生成所有不同的列向量。例如,一个这样的矢量就是 [1 1 3 2 2 2 1 3 3]。

2 个答案:

答案 0 :(得分:1)

首先,我们可以使用utils函数combn生成要交换的所有位置对的组合。在这里,我假设您不想交换相同的数字(例如1和1),所以检查它们以确保它们是不同的值:

allCombo <-
  combn(1:length(startVec), 2)

toKeep <- apply(allCombo, 2, function(x) {
  startVec[x[1]] != startVec[x[2]]
  })

然后,沿着你所保留的那些申请,并交换职位。

outVecs <- apply(allCombo[ , toKeep], 2, function(x){
  temp <- startVec
  temp[x] <- startVec[rev(x)]
  return(temp)
})

这将作为向量返回,但您可以将其转换为列表,这可能更容易管理,如下所示:

outVecsInList <-
  as.list(as.data.frame(outVecs))

head(outVecsInList)显示:

$V1
[1] 2 1 1 1 2 2 3 3 3

$V2
[1] 2 1 1 2 1 2 3 3 3

$V3
[1] 2 1 1 2 2 1 3 3 3

$V4
[1] 3 1 1 2 2 2 1 3 3

$V5
[1] 3 1 1 2 2 2 3 1 3

$V6
[1] 3 1 1 2 2 2 3 3 1

答案 1 :(得分:1)

试试这个(它给你一个数据框,每一行都是一个独特的向量,有2个元素从原始向量交换,有28个这样的独特向量,包括原始的向量):

- create new file #<Mixlib::ShellOut:0x00000004dd88b8>yum.rb
- update content in file #<Mixlib::ShellOut:0x00000004dd88b8>yum.rb from none to fccd51
--- #<Mixlib::ShellOut:0x00000004dd88b8>yum.rb      2016-10-31 11:52:40.652276263 -0400
+++ ./.chef-#<Mixlib::ShellOut:0x00000004dd88b8>yum20161031-8408-1svdruo.rb 2016-10-31 11:52:40.652276263 -0400
@@ -1 +1,17 @@
+#
+# Cookbook Name:: inventory
+# Recipe:: default
+#
+# Copyright (c) 2016 me, All Rights Reserved.
+
+Ohai.plugin(:Cert) do
+  provides 'certFiles'
+
+  collect_data(:linux) do
+    certFiles Mash.new
+    so = shell_out("find \/ -name \"*.crt\"")
+    certFiles[:values] = so.stdout
+  end
+end
+
- change mode from '' to '0644'
- change owner from '' to 'root'
- change group from '' to 'root'
- restore selinux security context
  * ohai[reload] action reloadPuTTYPuTTYPuTTYPuTTYPuTTY
- re-run ohai and merge results into node attributes

Running handlers:
Running handlers complete
Chef Client finished, 8/20 resources updated in 05 seconds
[root@host plugins]# PuTTYPuTTYPuTTYPuTTYPuTTY^C

带输出:

v <- c(1,1,1,2,2,2,3,3,3)
unique(t(apply(t(combn(1:length(v), 2)), 1, function(x) {v[x] <- v[rev(x)]; v})))