как сгенерировать без повторения комбинацию в R с помощью функции combn() и обобщить код?

#r #combinations

Вопрос:

Хай, у меня есть это:

 list(
myvector_a=c("X1","X2","X3"),
myvector_b=c("X1","X3","X4"),
myvector_c=c("X2","X5","X6"))->mydata
 

Ожидаемый результат: сборка вручную

 list(
  myvector_a=list(c_1_1=myvector_a[[1]],
                  c_1_2=myvector_a[[2]],
                  c_1_3=myvector_a[[3]],
                  c_2_1=c(myvector_a[[1]],myvector_a[[2]]),
                  c_2_1=c(myvector_a[[1]],myvector_a[[3]]),
                  c_2_1=c(myvector_a[[2]],myvector_a[[3]]),
                  c_3_1=c(myvector_a[[1]],myvector_a[[2]],myvector_a[[3]])),
  myvector_b=list(c_1_1=myvector_b[[1]],
                  c_1_2=myvector_b[[2]],
                  c_1_3=myvector_b[[3]],
                  c_2_1=c(myvector_b[[1]],myvector_b[[2]]),
                  c_2_1=c(myvector_b[[1]],myvector_b[[3]]),
                  c_2_1=c(myvector_b[[2]],myvector_b[[3]]),
                  c_3_1=c(myvector_b[[1]],myvector_b[[2]],myvector_b[[3]])),
  myvector_c=list(c_1_1=myvector_c[[1]],
                  c_1_2=myvector_c[[2]],
                  c_2_1=c(myvector_c[[1]],myvector_c[[2]])))->result

 

Это было мое самое близкое решение к тому, что мне нужно:

 x<-NULL
for(i in 1:3)
  for(j in 1:length(mydata[[i]]))
    combn(mydata[[i]],j) -> result[[paste0(names(mydata[i]))]][[paste0("c_",i,"_",j)]]
 

Например, в полученном выводе: результат[[«myvector_a»]][[«c_1_2»]] Я не мог разделить, как в ожидаемом выводе: результат[[«myvector_a»]][[«c_2_1»]], результат[[«myvector_a «]][[«c_2_2»]] и результат[[«myvector_a»]] [[«c_2_3»]].

Ожидаемый результат:                                                                     Полученный результат:
введите описание изображения здесь

Ответ №1:

Вот способ использования lapply внутри lapply

 result <- lapply(mydata, function(x) {
  unlist(lapply(seq_along(x), function(y) combn(x, y, list)), recursive = FALSE)
})
 

введите описание изображения здесь


Использование list и unlist делается только для того, чтобы получить требуемую структуру вывода. Если вы не слишком обеспокоены этим, это тоже сработает.

 result <- lapply(mydata, function(x) lapply(seq_along(x), function(y) combn(x, y)))
 

Комментарии:

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

2. Вы имеете в виду, что использование данных из вашего поста и использование 1-го ответа из моего поста не дает вам того же результата, что показано на изображении?

3. Извините, в комментариях непонятно форматирование. Что lengths(result) означает для вас возврат? В этом примере их должно быть 7 для всех. Я перезапустил R и снова проверил ответ. Это дает мне именно то, что я показал.

4. Извини, я тоже сбросил свой, теперь сбросил! Благодарный

Ответ №2:

Мы могли бы использовать outer от base R

 out <- c(outer(seq_along(mydata), seq_along(mydata), 
   FUN = Vectorize(function(i, j) combn(mydata[[i]], j, FUN = list))))