#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))))