Вот подход с помощью 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()
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