r中的多重组合和置换

时间:2017-10-10 06:59:17

标签: 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 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和#34;来创建每一列。恒定和递增"范围2"并相应地减少"范围3"。此外,我只尝试10行,但将来行数可以增加。 虽然我尝试了

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

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

但不是成功。有没有其他方法这样做。任何想法都会很感激。谢谢你提前

DOMNICK

1 个答案:

答案 0 :(得分:1)

为了更简短的解释和更普遍(正如你提到的那样,行数可以更大10)我建议你可以自己实现以下逻辑: 一开始,初始设置。

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

下面的代码会创建10个元素集的所有唯一组合,其中顺序无关紧要。

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

在10个元素集中,必须出现所有唯一元素

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

}