Как создать вектор в R с каждой комбинацией значений в указанном формате? - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь использовать R для создания вектора с каждой перестановкой символов, перечисленных в следующих векторах в указанном формате.

a <- c("1","2","3","4","5","6","7","8","9")
b <- c("0","1","2","3","4","5","6","7","8","9")
c <- c("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z")

С указанными выше векторами я хотел бы создать новый вектор с каждой перестановкой этих переменных в следующем формате:

a
ac
acc
abcc
abbcc

Результат должен включать такие значения, как:

c("1","1A","348BE")

Сначала я пытался использовать вложенные циклы while и for, но это привело к большому беспорядку кода, который работал некорректно.

Я понимаю, что это будет очень большой вектор, так что, может быть, это не правильный подход?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вот функция kludged вместе, чтобы произвести то, что вы ищете

library(dplyr)

item1 <- as.character(1:9)
item2 <- as.character(0:9)
item3 <- c(item2, LETTERS)



fn <- function(x){

    switch(x,
       a = {
         item1
       },
       ac = {
         expand.grid(item1, item3) %>% 
           transmute(val = paste0(Var1, Var2)) %>% 
           .$val
       },
       acc = {
         expand.grid(item1, item3, item3) %>% 
           transmute(val = paste0(Var1, Var2, Var3)) %>%
           .$val
       },
       abcc = {
         expand.grid(item1, item2, item3, item3) %>% 
           transmute(val = paste0(Var1, Var2, Var3, Var4)) %>% 
           .$val
       },
       abbcc = {
         expand.grid(item1, item2, item2, item3, item3) %>% 
           transmute(val = paste0(Var1, Var2, Var3, Var4, Var5)) %>% 
           .$val
       },
       stop("Doing it wrong!")
    )

}

c(fn('a'), fn('ac'), fn('acc'), fn('abcc'), fn('abbcc'))
0 голосов
/ 18 января 2019

Конечно, есть более элегантный способ получить все форматы одновременно, но вы можете сделать что-то подобное для каждого формата и затем объединить результаты:

library(tidyverse)
abbcc <- crossing(a, b, b, c, c) %>% 
  unite("combinations", sep = "")

abbcc
# A tibble: 1,040,400 x 1
   combinations
   <chr>       
 1 10000       
 2 10001       
 3 10002       
 4 10003       
 5 10004       
 6 10005       
 7 10006       
 8 10007       
 9 10008       
10 10009 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...