Как сгенерировать определенное количество векторов итеративно в R?

#r #for-loop

#r #для цикла

Вопрос:

Я анализирую данные PCA. Поэтому я должен сравнить PC1 с PC2, PC1 с PC3 и т.д. Я хочу сохранить эти объекты ggplot в вектор. Пока здесь никаких проблем нет. Я создаю вектор как :

 Myplot <- vector('list',NumberToBeInserted)
 

и тогда я могу запустить цикл for или lapply. Однако предположим, что в ближайшем будущем мне нужно будет проанализировать PC2 против PC3 (до PC2 против PCn) или больше в целом PCn-1 против PCn. Поэтому мне нужно сгенерировать много этих векторов, чтобы хранить сравнения ПК в другом наборе. Допустим, я знаю, что мне нужно 5 векторов, подобных тому, который я предложил выше. Как я могу создать функцию, которая возвращает мне эти векторы?Имеет ли смысл этот вопрос или лучше сделать это вручную? Поскольку я хочу улучшить свои навыки работы с R, мне очень любопытно

Ответ №1:

Я не уверен, что это то, что вы ищете, но предположим, что у меня есть список из 5 сложных объектов (для примера здесь все они представляют собой простые символьные строки, но тот же метод будет работать для любого объекта R, такого как ggplot):

 big_list <- list(PC1 = "Complex object1",
                 PC2 = "Complex object2",
                 PC3 = "Complex object3",
                 PC4 = "Complex object4",
                 PC5 = "Complex object5")
 

Если мне нужен новый список, содержащий каждую попарную комбинацию элементов в этом списке, я могу сделать:

 all_combos <- apply(combn(5, 2), 2, function(i) big_list[i])
names(all_combos) <- NULL
 

Существует десять возможных парных комбинаций из 5 объектов, поэтому у меня будет список длиной 10, каждый из которых сам по себе является списком моих сложных объектов длиной два:

 str(all_combos)
#> List of 10
#>  $ :List of 2
#>   ..$ PC1: chr "Complex object1"
#>   ..$ PC2: chr "Complex object2"
#>  $ :List of 2
#>   ..$ PC1: chr "Complex object1"
#>   ..$ PC3: chr "Complex object3"
#>  $ :List of 2
#>   ..$ PC1: chr "Complex object1"
#>   ..$ PC4: chr "Complex object4"
#>  $ :List of 2
#>   ..$ PC1: chr "Complex object1"
#>   ..$ PC5: chr "Complex object5"
#>  $ :List of 2
#>   ..$ PC2: chr "Complex object2"
#>   ..$ PC3: chr "Complex object3"
#>  $ :List of 2
#>   ..$ PC2: chr "Complex object2"
#>   ..$ PC4: chr "Complex object4"
#>  $ :List of 2
#>   ..$ PC2: chr "Complex object2"
#>   ..$ PC5: chr "Complex object5"
#>  $ :List of 2
#>   ..$ PC3: chr "Complex object3"
#>   ..$ PC4: chr "Complex object4"
#>  $ :List of 2
#>   ..$ PC3: chr "Complex object3"
#>   ..$ PC5: chr "Complex object5"
#>  $ :List of 2
#>   ..$ PC4: chr "Complex object4"
#>   ..$ PC5: chr "Complex object5"
 

Итак, чтобы получить доступ к первому сопряжению объектов, я бы сделал:

 all_combos[[1]]
#> $PC1
#> [1] "Complex object1"
#> 
#> $PC2
#> [1] "Complex object2"