Как использовать R для ввода нескольких значений группировки и получения результатов наблюдений в сетке 8x6? - PullRequest
2 голосов
/ 08 апреля 2020

Я новичок ie в мире кодирования / программирования. Я до сих пор люблю этот вызов, но я немного постучался.

Я пытаюсь автоматизировать подготовку к генотипированию для моей работы лаборантом.


Ненужный фон:

Я забочусь о колонии из 500-600 мышей с 40-50 данными генотипами в любой момент времени. Всякий раз, когда я получаю новые пометы (в зависимости от генотипа родителей), я должен извлечь ДНК и подтвердить генотип потомства. Поначалу задачи и задачи по устранению неполадок были забавными, но теперь они становятся очень обыденными и повторяющимися. Поэтому я начал использовать R для автоматизации определенных частей моей работы.

TL / DR: Моя работа становится повторяющейся, я хочу, чтобы R помог с этим.


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

Mouse ID  Genotype   Gender  Age       Litter_ID   PCR_Temp  Rxns
ZDP658    zDC.Cre       F    4.9        B23844-1      Z        1
ZDP659    zDC.Cre       F    4.9        B23844-1      Z        1
ZDP631    Villin.Cre    F    4.9        B23745-2      Y        1
ZDP575    K14.CreER     M    5.3        B23744-2      Z        1
ZDO931    K14.CreER     M    8.6        B23744-1      Z        1
ZDO932    K14.CreER     M    8.6        B23744-1      Z        1
ZDO933    K14.CreER     M    8.6        B23744-1      Z        1
ZDQ31     Rosa.TSLP     M    3.4        B23701-2      Z        2
ZDQ32     Rosa.TSLP     M    3.4        B23701-2      Z        2

Моя цель - получить выходные данные отдельных Mouse_ID в сетке 8x6, сгруппированные по их «PCR_Temps» и умноженные на их «Rxns» в зигзагообразном порядке, если это возможно, с двумя дополнительными пробелами на группу генотипа. ,

Мое видение вывода следующее. Я хотел бы ввести Litter_ID пометов, которые нуждаются в генотипировании и получить следующее.

PCR Prep

Сотовая структура не требуется. Простая прямоугольная сетка angular отлично работает. То же касается и зигзагообразного формата. Оба этих аспекта выходного формата были бы хорошими, но не обязательными.

Каждой группе генотипов потребуется один пробел для образцов положительного контроля и один пробел для образцов дикого типа / контрольного образца. Генотипы, имеющие значение «2» или более, будут повторяться столько раз, сколько указано в их значении «Rxns».

Извините, если этот вопрос слишком дремучий, чтобы его можно было использовать. До сих пор я работал с dplyr и ggplot, чтобы манипулировать и визуализировать мои архивы мыши, но эта конкретная проблема приводит меня в замешательство.

Если бы кто-нибудь даже мог указать мне в направлении пакета, который мог бы начать меня, я был бы очень признателен.

До сих пор я пробовал некоторые комбинации dplyr и purrr безуспешно. Я думал о способах использования для циклов, но пришел пустой.

Заранее спасибо за любые советы.

1 Ответ

1 голос
/ 09 апреля 2020

Вот подход с помощью dplyr, grid и gridExtra.

Пожалуйста, извините за горячий беспорядок, который является моим соглашением по именованию переменных.

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

Сначала давайте определим наши пометы и отфильтруем данные мыши.

library(dplyr)
library(grid)
library(gridExtra)

geno.litters <- c("B23701-2", "B23744-1", "B23844-1","B23944-1")
mice <- data %>% 
            filter(Litter_ID %in% geno.litters) %>%
            arrange(Litter_ID,MouseID) %>%
            split(.,.$PCR_Temp)

mice теперь представляет собой список мышей, разделенных на чашки по температуре ПЦР.

Давайте определим пользовательскую функцию для добавления положительного и отрицательного контролей и дублирования строк для тех генотипов, которые нужны дубликаты. Мы можем применить эту функцию к каждому элементу списка с помощью lapply.

addControlSlots <- function(x){
  genotypes <- unique(x$Genotype)
  genotype.dfs <- list()
  for ( i in seq_along(genotypes)){
    litter.mice <- x[x$Genotype == genotypes[i],]
    litter <- litter.mice[1,"Litter_ID"]
    Temp <- litter.mice[1,"PCR_Temp"]
    litter.mice <- rbind(litter.mice,litter.mice[litter.mice$Rxns == 2,])
    litter.mice <- litter.mice[order(litter.mice$MouseID),]
    control.rows <- data.frame(Litter_ID = litter, MouseID = c("PosCont","NegCont"),Gender = NA,Genotype = genotypes[i], PCR_Temp = Temp, Rxns = 1)
    genotype.dfs[[i]] <- rbind(litter.mice,control.rows)
  }
do.call(rbind,genotype.dfs)
}

processed.temps <- lapply(mice,addControlSlots)
processed.temps[[2]]
#$Z
#    Litter_ID MouseID Gender  Genotype PCR_Temp Rxns
#1    B23701-2   ZO960      F   zDC.Cre        Z    1
#2    B23701-2   ZP810      F   zDC.Cre        Z    1
#3    B23701-2   ZP992      M   zDC.Cre        Z    1
#4    B23701-2 PosCont   <NA>   zDC.Cre        Z    1
#5    B23701-2 NegCont   <NA>   zDC.Cre        Z    1
#...15 more rows

Теперь у нас есть элементы управления после каждого генотипа.

Теперь давайте определим функцию для заполнения планшета ПЦР. И снова примените его к списку.

makePCRPlate <- function(x){
  mouse.vector <- as.character(x$MouseID)
  plate.vector <- rep(NA,6*8)
  plate.vector[1:length(mouse.vector)] <- mouse.vector
  wide <- matrix(plate.vector,nrow=2,byrow = FALSE)
  rbind(wide[,1:8],wide[,9:16],wide[,17:24])
} 

pcr.plates <- lapply(processed.temps,makePCRPlate)
pcr.plates[[2]]
#     [,1]      [,2]      [,3]      [,4]    [,5]    [,6]    [,7]    [,8]   
#[1,] "ZO960"   "ZP992"   "NegCont" "ZO214" "ZP333" "ZP455" "ZP478" "ZQ130"
#[2,] "ZP810"   "PosCont" "ZO214"   "ZP333" "ZP455" "ZP478" "ZQ130" "ZQ875"
#[3,] "ZQ875"   "NegCont" NA        NA      NA      NA      NA      NA     
#[4,] "PosCont" NA        NA        NA      NA      NA      NA      NA     
#[5,] NA        NA        NA        NA      NA      NA      NA      NA     
#[6,] NA        NA        NA        NA      NA      NA      NA      NA    

Мы можем видеть, что образцы были заполнены зигзагообразным узором.

Теперь давайте используем grid для создания .pdf файла с макетами.

pdf("MyPCRPlates.pdf")
for(i in seq_along(pcr.plates)){
  grid.newpage()
  grid.table(pcr.plates[[i]])
  grid.text(paste0("PCR Temp ",names(pcr.plates)[i]),y = unit(0.9,"npc"))
}
dev.off()  

enter image description here

The .pdf файл должен иметь страницу для каждой температуры.

Данные

set.seed(1)
data1 <- data.frame("MouseID" = paste0("Z",sample(c("O","P","Q"),size = 50,replace = TRUE),round(runif(50,1,999))),
Litter_ID = sample(c("B23701-2", "B23744-1", "B23744-2", "B23745-2", "B23844-1","B23944-1", "B23944-2", "B23951-1"),size=50, replace = TRUE),
Gender = sample(c("F","M"), size = 50, replace = TRUE))

data2 <- data.frame(Genotype = c("zDC.Cre","Villin.Cre","Villin.Cre","zDC.Cre","K14.CreER","Rosa.TSLP","Rosa.TSLP","K14.CreER"), 
                    Litter_ID = c("B23701-2", "B23744-1", "B23744-2", "B23745-2", "B23844-1","B23944-1", "B23944-2", "B23951-1"),
                    PCR_Temp = c("Z","Y","Y","Z","Y","Z","Z","Y"),
                    Rxns = c(1,1,1,1,1,2,2,1))
data <- merge(data1,data2)
data
#   Litter_ID MouseID Gender   Genotype PCR_Temp Rxns
#1   B23701-2   ZP810      F    zDC.Cre        Z    1
#2   B23701-2   ZP992      M    zDC.Cre        Z    1
#3   B23701-2   ZO960      F    zDC.Cre        Z    1
#4   B23744-1   ZO122      F Villin.Cre        Y    1
#5   B23744-1   ZQ259      F Villin.Cre        Y    1
#... 45 more rows
...