r создание перестановок текста/имен переменных без использования цикла

#r

Вопрос:

Мне нужно создать имена переменных на основе перестановок нескольких уровней. Однако я не хочу использовать для этого цикл. Вот несколько примеров кода,

 Varname lt;- "Var" Level1 lt;- c("A","B") Level2 lt;- c(1,2,3)  

Если я напишу это, то получу первый уровень.

 gt; paste0(Varname , Level1)  [1] "VarA" "VarB"  

Я хотел бы получить метод, позволяющий получить любой из этих результатов:

 "VarA1" "VarA2" "VarA3" "VarB1" "VarB2" "VarB3" "VarA1" "VarB1" "VarA2" "VarB2" "VarA3" "VarB3"  

Я думал, что это сработает, но, увы, нет.

 gt; paste0( paste0(Varname , Level1) , Level2) [1] "VarA1" "VarB2" "VarA3"  

Есть ли способ сделать это просто или функция, которая делает это, без необходимости использовать цикл? Заранее спасибо.

Ответ №1:

Мы можем использовать outer функцию для применения ко всем комбинациям из 2 переменных:

 paste0(Varname, outer(l1, l2, paste0)) # [1] "VarA1" "VarB1" "VarA2" "VarB2" "VarA3" "VarB3"  

Ответ №2:

Используя expand.grid и paste0 вы могли бы сделать:

 d lt;- expand.grid(Level2, Level1) paste0(Varname, d$Var2, d$Var1) #gt; [1] "VarA1" "VarA2" "VarA3" "VarB1" "VarB2" "VarB3"  

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

1. Как однострочный, если требуется, with(expand.grid(Level2, Level1), paste0(Varname, Var2, Var1))

2. @ и Стефан, и Грегор, это отлично работает! и может быть написано в одной строке. Он очень универсален для моих нужд. Поскольку я также использую»_», разделяющее перестановочные части. Спасибо