Последовательная итерация по нескольким входам

Кажется, это должно быть просто. У меня есть 2 списка, список из 3 экспериментов и 3 повторения в каждом эксперименте. Что я хотел бы сделать, так это прочитать все 9 повторений за один раз:

library(purrr)
x = list("exp1", "exp2", "exp3")
y = list("rep1", "rep2", "rep3")

Использование map() например:

map(x, function(x){paste(x, map(y, paste0))})

Однако, если я попробую map2(x, y, paste), я получу только 3 параллельных итерации обоих входов.

Нет ли простого способа сделать это за один вызов map2 вместо итераций вложенных карт? Спасибо.


person biomiha    schedule 24.05.2017    source источник
comment
С помощью dplyr вы можете выполнить внутреннее соединение с фиктивным столбцом, а затем paste получить результат. Аналогично, используя CJ (перекрестное соединение) из data.table.   -  person Akhil Nair    schedule 24.05.2017
comment
Этот тип делает то, что вы хотите map2(x,y,~paste(x,y)), однако привязка происходит для каждой строки, а не для поиска всех комбинаций y на x.   -  person timfaber    schedule 24.05.2017
comment
Извините @timfaber, но это просто трижды повторяет мой map2(x, y, paste) звонок.   -  person biomiha    schedule 24.05.2017
comment
Кстати, ваш вложенный вызов можно записать map(x, ~paste(.x, map(y, paste0))).   -  person Axeman    schedule 24.05.2017
comment
В базе R вы можете использовать outer следующим образом, чтобы вернуть вектор всех пар, склеенных вместе: c(outer(x, y, FUN=paste)).   -  person lmo    schedule 24.05.2017


Ответы (1)


Вам нужно будет явно сгенерировать различные комбинации, например, используя expand.grid:

expand.grid(x = x, y = y) %>% { map2(.$x, .$y, paste) }
person Axeman    schedule 24.05.2017
comment
Согласен, лучше, чем вложенные вызовы карты. Спасибо. - person biomiha; 24.05.2017