0

I'm trying to prepare a dynamic permutation set for a dataset such that it looks this

  ID        Val Perm 1  Perm 2  Perm3   Perm 4  Perm 5  Perm 6  Perm 7  Perm 8  Perm 9  Perm 10 Perm 11 Perm 12 Perm 13 Perm 14 Perm 15 Perm 16 Perm 17 Perm 18 Perm 19 Perm 20 Perm 21 Perm 22 Perm 23 Perm 24 Perm 25 Perm 26 Perm 27 Perm 28 Perm 29 Perm 30 Perm 31 Perm 32 Perm 33 Perm 34 Perm 35 Perm 36
 12,000      1  Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1
 12,581      2  Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1
 12,857      2  Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1
 13,387      5  Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1
 15,846      2  Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1
 23,387      5  Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1
 25,424      4  Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1
 25,424      2  Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 1
 25,932      6  Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 2 Range 3 Range 2 Range 2
 25,932      1  Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3

from the data set

    dput(df)
structure(list(ID = c(12000, 12581, 12857, 13387, 15846, 23387, 
25424, 25424, 25932, 25932), Val = c(1L, 2L, 2L, 5L, 2L, 5L, 
4L, 2L, 6L, 1L)), .Names = c("ID", "Val"), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L), spec = structure(list(
    cols = structure(list(ID = structure(list(), class = c("collector_number", 
    "collector")), Val = structure(list(), class = c("collector_integer", 
    "collector"))), .Names = c("ID", "Val")), default = structure(list(), class = c("collector_guess", 
    "collector"))), .Names = c("cols", "default"), class = "col_spec"))

here I try to create every column by keeping "Range 1" constant and incrementing "Range 2" and correspondingly decreasing "Range 3". Also I m trying it for only 10 rows but in future the number of rows can increase. While I had tried with

apply(combinations(n=3,r=5,v = c("Range 1","Range 2","Range 3"),repeats.allowed = T),2,sort)

AND

v <- c("Range 1","Range 2","Range 3");expand.grid(rep(list(v), 5))

But not success though. Is there any other way round to do so. Any ideas would be appreciate.Thanks in advance

Domnick

Domnick
  • 509
  • 8
  • 25
  • [How to make a great R reproducible example?](http://stackoverflow.com/questions/5963269) – Sotos Oct 10 '17 at 07:29
  • tried making a reproducible dataframe.kindly check update – Domnick Oct 10 '17 at 07:35
  • What `df$Val` represents, and how it correspond with permutations? What is the logic for generating columns from values? – GoGonzo Oct 10 '17 at 08:42
  • @Gonzo `df$Val` represent arbitrary values; but the logic for preparing the permutations columns would be first column for permutation("Perm 1") be like keeping the "Range 1" constant and "Range 2" and "Range 3" changing , "Range 2" has been kept increasing and "Range 3" decreasing till column "Perm 8" and from column "Perm 9" the value "Range 1" has been incremented by 1 and "Range 2" and "Range 3" changing , "Range 2" has been kept increasing and "Range 3" decreasing till column "Perm 15" and from "Perm 16"th column the "Range 1" has again incremented by 2 and so on.... – Domnick Oct 10 '17 at 09:03

1 Answers1

1

For the sake of shorter explanation and more universal (as you mentioned number of rows can be grater that 10) I'm proposing following logic which you can implement yourself: At the beginning, initial settings.

n <- 10
k <- 3  
df <- as.data.frame( lapply(1:n, function(x) x <- k:1 ) )

Code below creates all unique combinations of 10-element set where order doesn't matter.

all <- as.matrix( expand.grid(df) )
all_sorted <- t( apply(all, 1, sort) )
all_sorted_unique <- unique(all_sorted)

In 10-elements set, all unique elements must appear

exclude_if_not_all <- 
  which( 
    apply(all_sorted_unique, 1, 
      function(x) length(unique(x))!=3) 
  )

t( all_sorted_unique[-exclude_if_not_all,] )

Result as expected.

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36]
 [1,]    1    1    1    1    1    1    1    1    1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1
 [2,]    2    2    1    2    1    1    2    1    1     1     2     1     1     1     1     2     1     1     1     1     1     2     1     1     1     1     1     1     2     1     1     1     1     1     1     1
 [3,]    3    2    2    2    2    1    2    2    1     1     2     2     1     1     1     2     2     1     1     1     1     2     2     1     1     1     1     1     2     2     1     1     1     1     1     1
 [4,]    3    3    3    2    2    2    2    2    2     1     2     2     2     1     1     2     2     2     1     1     1     2     2     2     1     1     1     1     2     2     2     1     1     1     1     1
 [5,]    3    3    3    3    3    3    2    2    2     2     2     2     2     2     1     2     2     2     2     1     1     2     2     2     2     1     1     1     2     2     2     2     1     1     1     1
 [6,]    3    3    3    3    3    3    3    3    3     3     2     2     2     2     2     2     2     2     2     2     1     2     2     2     2     2     1     1     2     2     2     2     2     1     1     1
 [7,]    3    3    3    3    3    3    3    3    3     3     3     3     3     3     3     2     2     2     2     2     2     2     2     2     2     2     2     1     2     2     2     2     2     2     1     1
 [8,]    3    3    3    3    3    3    3    3    3     3     3     3     3     3     3     3     3     3     3     3     3     2     2     2     2     2     2     2     2     2     2     2     2     2     2     1
 [9,]    3    3    3    3    3    3    3    3    3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     2     2     2     2     2     2     2     2
[10,]    3    3    3    3    3    3    3    3    3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3

What you need to do right now is to bind only this matrix to your initial data. All in Function

customPermutation <- function(n, k){

  df <- as.data.frame( lapply(1:n, function(x) x <- 1:k ) )

  all <- as.matrix( expand.grid(df) )
  all_sorted <- t( apply(all, 1, sort) )
  all_sorted_unique <- unique(all_sorted)

  exclude_if_not_all <- which( apply(all_sorted_unique, 1, function(x) length(unique(x))!=3) )
  t( all_sorted_unique[-exclude_if_not_all,] )

}
GoGonzo
  • 2,637
  • 1
  • 18
  • 25