R语言实现列举n个数据分成两组的所有可能组合

最近被一个糟糕的事情缠上身,帮忙做了一些改进。其中有个细节涉及到用R语言列举将数据划分为两组的所有可能,搜了一下貌似没怎么搜到做法,但是看到了matlab的一个提问,参考那个问题下的答案,写了R语言实现的代码,这里记录下做法。参考问题如下:

https://www.ilovematlab.cn/thread-340306-1-1.html

先稍微解释下做法。阐述下我们的问题:

假设有n个数据,现在需要列举出将这n个数据分为两组的所有可能的组合。
比如说现在有四个数据,暂且标注为 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,划分为两组的所有可能组合应当有 2 4 − 1 − 1 = 7 2^{4-1}-1=7 2411=7种,也就是:
( x 1 , x 2 x 3 x 4 ) (x_1, x_2 x_3 x_4) (x1,x2x3x4) ( x 2 , x 1 x 3 x 4 ) (x_2, x_1 x_3 x_4) (x2,x1x3x4) ( x 3 , x 1 x 2 x 4 ) (x_3, x_1 x_2 x_4) (x3,x1x2x4) ( x 4 , x 1 x 2 x 3 ) (x_4, x_1 x_2 x_3) (x4,x1x2x3)
( x 1 x 2 , x 3 x 4 ) (x_1x_2, x_3 x_4) (x1x2,x3x4) ( x 1 x 3 , x 2 x 4 ) (x_1x_3, x_2 x_4) (x1x3,x2x4) ( x 1 x 4 , x 2 x 3 ) (x_1x_4, x_2 x_3) (x1x4,x2x3)

根据参考的回复,可以这么做:

  1. 首先找到和为 2 n − 1 2^n-1 2n1的所有二元组。比如上述问题,找到和为 2 4 − 1 = 15 2^4-1=15 241=15的所有二元组,也就是 ( 1 , 14 ) , ( 2 , 13 ) , ( 3 , 12 ) , ( 4 , 11 ) , ( 5 , 10 ) , ( 6 , 9 ) , ( 7 , 8 ) (1, 14), (2, 13), (3, 12), (4, 11), (5, 10), (6, 9), (7, 8) (1,14),(2,13),(3,12),(4,11),(5,10),(6,9),(7,8)总共7种。
  2. 将每个二元组中的数值转为二进制字符串。
  3. 补全字符串位数后转为数值向量,再找到数值为1的下标作为同组元素。

具体做法如下:

n <- 4

## step1 获取所有和为2^n-1的二元组
splitFunc <- function(n) {
  sumNum <- 2**n-1
  t1 <- 1:as.integer(sumNum/2)
  t2 <- sumNum - t1
  com <- cbind(t1, t2)
  return(com)
}

## step2, step3同时进行
com <- splitFunc(n)
setList <- list()
for (i in 1:nrow(com)) {
  set1 <- com[i,1]; set2 <- com[i,2]
  set1 <- R.utils::intToBin(set1) ## 转为二进制
  set2 <- R.utils::intToBin(set2)
  set1 <- strpad(set1, k, 'left', '0') ## 补全字符串长度
  set2 <- strpad(set2, k, 'left', '0') ## 补全字符串长度
  
  set1 <- as.numeric(strsplit(set1, '')[[1]]) ## 转为数值向量
  set1 <- which(set1 == 1) ## 确定组内元素
  set2 <- as.numeric(strsplit(set2, '')[[1]])
  set2 <- which(set2 == 1)
  
  setList[[i]] <- list(set1 = set1, set2 = set2)
}

你可能感兴趣的:(R,r语言)