составление комбинаций из 6 чисел с использованием трех пар из четырех пар (1,2), (3,4), (5,6), (7,8) в R - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь составить комбинации из 6 чисел, используя три пары из четырех пар (1,2), (3,4), (5,6), (7,8) в R

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 голосов
/ 30 декабря 2018

Еще одна возможность, начиная с вектора '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
0 голосов
/ 31 декабря 2018

Вот еще один способ, используя функцию combination из пакета gtools:

Создайте список ваших пар:

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

Затем создайте комбо-матрицу 4 select 3:

combos <- combination(4, 3)

Затем используйте функцию карты purrr для генерации списка выходных векторов

vec.list <- map(1:4, function(x) unlist(pair.list[combos[x, ]]))

Наконец, преобразуйте список векторов в data.frame:

df <- data.frame(Reduce(rbind, vec.list))

Преимущество этой стратегии заключается в том, что ваши кортежи могут быть любой длины и иметь любые значения.

0 голосов
/ 30 декабря 2018

Мы можем создать группирующую переменную для 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, созданный вместо предварительно обработанной 'д».Если мы уже разделили его на столбцы, это будет намного проще, поскольку @markus упомянул

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

data

d <- 1:8
...