#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. @ и Стефан, и Грегор, это отлично работает! и может быть написано в одной строке. Он очень универсален для моих нужд. Поскольку я также использую»_», разделяющее перестановочные части. Спасибо