Создать именованный список из всех комбинаций двух векторов - PullRequest
2 голосов
/ 17 октября 2019

Моя цель - создать именованный список реплик в каждом типе образца, чтобы я мог вызывать их с помощью samples$cell.wt.control. У меня есть код, который работает, он просто нелепо длинный, и я чувствую, что должен быть более простой способ. Есть вопросы о том, как составлять именованные списки из двух векторов и как создавать все комбинации из двух векторов, но я ничего не мог найти, создав именованный список из всех комбинаций двух векторов, используя один в качестве имени результатов.

library(tidyverse)

samples_base = c("cell.wt.control",
                 "cell.wt.protein_ko",
                 "cell.mutant.control",
                 "cell.mutant.protein_ko")
replicates = LETTERS[1:3]

samples = 
  outer(samples_base, replicates, paste, sep = ".") %>% t %>% as.data.frame %>% 
  set_names(samples_base) %>% 
  mutate_if(is.factor, as.character) %>% 
  pivot_longer(starts_with("cell")) %>% 
  group_by(name) %>% summarize(sample = list(value)) %>% deframe

#$cell.mutant.control
#[1] "cell.mutant.control.A" "cell.mutant.control.B" "cell.mutant.control.C"

#$cell.mutant.protein_ko
#[1] "cell.mutant.protein_ko.A" "cell.mutant.protein_ko.B" "cell.mutant.protein_ko.C"

#$cell.wt.control
#[1] "cell.wt.control.A" "cell.wt.control.B" "cell.wt.control.C"

#$cell.wt.protein_ko
#[1] "cell.wt.protein_ko.A" "cell.wt.protein_ko.B" "cell.wt.protein_ko.C"

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Вы можете сделать это с помощью purrr:

samples_base %>%
    set_names() %>%
    purrr::map(~ paste0(., ".", replicates))

Вывод:

$cell.wt.control
[1] "cell.wt.control.A" "cell.wt.control.B" "cell.wt.control.C"

$cell.wt.protein_ko
[1] "cell.wt.protein_ko.A" "cell.wt.protein_ko.B" "cell.wt.protein_ko.C"

$cell.mutant.control
[1] "cell.mutant.control.A" "cell.mutant.control.B" "cell.mutant.control.C"

$cell.mutant.protein_ko
[1] "cell.mutant.protein_ko.A" "cell.mutant.protein_ko.B" "cell.mutant.protein_ko.C"
2 голосов
/ 17 октября 2019

Кажется, что необходимость вводить это в набор данных и делать его слишком сложной. Вы можете зациклить его с помощью Map, имя которого будет автоматически основано на первом аргументе:

Map(paste, samples_base, list(replicates), sep=".")
#List of 4
# $ cell.wt.control       : chr [1:3] "cell.wt.control.A" "cell.wt.control.B" ...
# $ cell.wt.protein_ko    : chr [1:3] "cell.wt.protein_ko.A" "cell.wt.protein_ko.B" ...
# $ cell.mutant.control   : chr [1:3] "cell.mutant.control.A" "cell.mutant.control.B" ...
# $ cell.mutant.protein_ko: chr [1:3] "cell.mutant.protein_ko.A" "cell.mutant.protein_ko.B" ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...