r中的多重组合与置换

r中的多重组合与置换,r,dataframe,combinations,permutation,apply,R,Dataframe,Combinations,Permutation,Apply,我试图为一个数据集准备一个动态排列集,使它看起来像这样 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 2

我试图为一个数据集准备一个动态排列集,使它看起来像这样

  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
从数据集

    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"))
在这里,我试图通过保持“范围1”不变,增加“范围2”,并相应减少“范围3”来创建每一列。此外,我尝试它只有10行,但在未来的行数可以增加。 当我试着

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


v为了更简短的解释和更普遍的意义(正如您提到的行数可以大于10),我建议您自己实现以下逻辑:
在开始时,初始设置

n <- 10
k <- 3  
df <- as.data.frame( lapply(1:n, function(x) x <- k:1 ) )
您现在需要做的是仅将此矩阵绑定到初始数据。 全功能

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,] )

}

customPermutation尝试创建可复制的数据帧。请检查update
df$Val
代表什么,以及它如何与排列相对应?从值生成列的逻辑是什么?@Gonzo
df$Val
表示任意值;但是,准备排列列的逻辑将是排列的第一列(“排列1”),就像保持“范围1”不变,“范围2”和“范围3”不断变化一样,“范围2”一直在增加,“范围3”一直在减少,直到列“排列8”,从列“排列9”开始,“范围1”的值增加了1和“范围2”“范围3”不断变化,“范围2”不断增加,“范围3”不断减少,直到第“Perm 15”列,从第“Perm 16”列开始,“范围1”再次增加2,依此类推……它按照我想要的方式工作。非常感谢,非常感谢。
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,] )
      [,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
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,] )

}