我正在尝试使用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)
}
,但是它不起作用。感谢您的帮助。谢谢。
答案 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