R 如何自定义排列,使任何组维度都不包含相同的索引两次?

R 如何自定义排列,使任何组维度都不包含相同的索引两次?,r,algorithm,tidyverse,R,Algorithm,Tidyverse,我有以下TIBLE,其中包含一些索引的所有排列: bb <- as_tibble(expand.grid(v1=0:2, v2=0:2)) %>% arrange(v1, v2) bb # A tibble: 9 x 2 v1 v2 <int> <int> 1 0 0 2 0 1 3 0 2 4 1 0 5 1 1 6 1 2 7 2

我有以下TIBLE,其中包含一些索引的所有排列:

bb <- as_tibble(expand.grid(v1=0:2, v2=0:2)) %>%
  arrange(v1, v2)
bb
# A tibble: 9 x 2
     v1    v2
  <int> <int>
1     0     0
2     0     1
3     0     2
4     1     0
5     1     1
6     1     2
7     2     0
8     2     1
9     2     2
如何将其安排为生成此输出:

     v1    v2
  <int> <int>
1     0     0
2     1     1
3     2     2

4     0     1
5     1     2 
6     2     0

7     0     2
8     1     0
9     2     1

其中,输出为三组/组,这样在每个组中,每个变量中的索引不会重复。请注意,满足此条件的每个组/集只能有这么多行…

很抱歉,我对tibble不太熟悉,因此我提供了一个以R为基础的data.frame解决方案:

资料

更新:下面给出了一个适用于具有所需格式的所有组合的更高效的生成器:

genAllCombn <- function(n) {
  v1 <- rep(0:(n-1),n)
  v2 <- (v1 + rep(0:(n-1),1,each = n)) %% n
  return(data.frame(v1,v2))
}

> genAllCombn(4)
   v1 v2
1   0  0
2   1  1
3   2  2
4   3  3
5   0  1
6   1  2
7   2  3
8   3  0
9   0  2
10  1  3
11  2  0
12  3  1
13  0  3
14  1  0
15  2  1
16  3  2

你如何决定分组/集合?它总是固定的3行还是基于行数的一些公式?@RonakShah 0:N-1谢谢!感谢您花时间准备此答案,但结果不正确。每组不得重复索引,例如,在您的答案的第一组中,v2为0,0,0,0,因此它重复0。@天行者很抱歉我的函数移位器出错。我更新了我的解决方案和结果,所以它现在似乎是正确的,请检查它与转移酷的想法,我希望它可以更简单地使用tidyverse。。。我会考虑的。@SkyWalker我写了一个生成器,用于根据您的需要构造输出,请参阅我的更新,我认为这是非常有效的。
> res
  v1 v2
1  0  0
2  1  1
3  2  2
4  0  1
5  1  2
6  2  0
7  0  2
8  1  0
9  2  1
df <- structure(list(v1 = c(0L, 0L, 0L, 1L, 1L, 1L, 2L, 2L, 2L), v2 = c(0L, 
                                                                        1L, 2L, 0L, 1L, 2L, 0L, 1L, 2L)), class = "data.frame", row.names = c(NA, 
                                                                                                                                              -9L))

genAllCombn <- function(n) {
  v1 <- rep(0:(n-1),n)
  v2 <- (v1 + rep(0:(n-1),1,each = n)) %% n
  return(data.frame(v1,v2))
}

> genAllCombn(4)
   v1 v2
1   0  0
2   1  1
3   2  2
4   3  3
5   0  1
6   1  2
7   2  3
8   3  0
9   0  2
10  1  3
11  2  0
12  3  1
13  0  3
14  1  0
15  2  1
16  3  2