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



我有以下包含某些索引的所有排列:

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不是很熟悉,所以我提供了一个data.frame的解决方案,base R

shifter <- function(x, n) ifelse(n == 0, return(x), return(c(tail(x, -n), head(x, n))))
res <- `rownames<-`(Reduce(rbind,lapply(seq(length(dfs<-split(df,rep(0:2,3)))), 
function(k) {
dfs[[k]][,2] <- shifter(dfs[[k]][,1],k-1)
dfs[[k]]})),seq(nrow(df)))

这给了:

> 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

最新更新