使用R中的四对(1,2),(3,4),(5,6),(7,8)中的三对进行6个数字的组合

时间:2018-12-30 19:29:44

标签: r combinations

我正在尝试使用R中的四对(1,2),(3,4),(5,6),(7,8)中的三对来组合6个数字

d<-c(1,2,3,4,5,6,7,8)
dc1<-cbind(d[1:2],d[3:4],d[5:6])
dim(dc1)<-c(1,6)
dc2<-cbind(d[1:2],d[3:4],d[7:8])
dim(dc2)<-c(1,6)
dc3<-cbind(d[1:2],d[5:6],d[7:8])
dim(dc3)<-c(1,6)
dc4<-cbind(d[3:4],d[5:6],d[7:8])
dim(dc4)<-c(1,6)
rbind(dc1,dc2,dc3,dc4)

是否可以使用combn获取

   [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    1    2    3    4    7    8
[3,]    1    2    5    6    7    8
[4,]    3    4    5    6    7    8

我尝试过

d<-structure(list(d1=c(1,2),d2=c(3,4),d3=c(5,6),d4=c(7,8)),.Names = c("d1", "d2", "d3", "d4"), row.names = 1:2, class = "data.frame")
dc <- combn(d, 3, simplify=FALSE)
for(i in 1:length(dc)){
dim(dc[i])<-c(1,6)
}

,但是它不起作用。感谢您的帮助。谢谢。

3 个答案:

答案 0 :(得分:3)

我们可以为split创建一个分组变量,然后执行combn

grp <- as.integer(gl(length(d), 2, length(d)))
out <- do.call(rbind, combn(split(d, grp), 3, simplify = FALSE, FUN = unlist))
dimnames(out) <- NULL
out
#      [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    2    3    4    5    6
#[2,]    1    2    3    4    7    8
#[3,]    1    2    5    6    7    8
#[4,]    3    4    5    6    7    8

注意:在这里,初始对象只是创建的vector,而不是预先处理的'd'。如果我们已经将其分隔为列,则就像@markus提到的那样容易得多

t(combn(d, 3, FUN =unlist))

数据

d <- 1:8

答案 1 :(得分:1)

这是使用iterator包中的HashSet函数的另一种方式:

创建一个配对列表:

combination

然后创建4选择3组合矩阵:

gtools

然后使用purrr映射功能生成输出向量列表

pair.list <- list(c(1,2), c(3, 4), c(5, 6), c(7, 8))

最后将向量列表转换为data.frame:

combos <- combination(4, 3)

此策略的好处是您的元组可以是任意长度和任何值。

答案 2 :(得分:0)

从向量'd'开始的另一种可能性:

i <- (seq_along(d) + 1) %/% 2
t(combn(unique(i), 3, function(cb) d[i %in% cb]))
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    2    3    4    5    6
# [2,]    1    2    3    4    7    8
# [3,]    1    2    5    6    7    8
# [4,]    3    4    5    6    7    8