R/filter_pcr_amplicons.R

Defines functions filter_pcr_amplicons

## Requirement: "tibble"

filter_pcr_amplicons = function(pcr_data, reference_data, name_col_primer_pcr = "PRIMER_SET", 
                                name_col_primer_ref = "SHORT_NAME", name_col_orientation_pcr = "PRIMERS_USED",
                                name_col_forward_ref = "FORWARD", name_col_reverse_ref = "REVERSE"){
  
  list_pcr_data = lapply(split(pcr_data, pcr_data[[name_col_primer_pcr]]), function(x) 
    x[which(x[[name_col_orientation_pcr]] == names(sort(table(x[[name_col_orientation_pcr]]), decreasing = T))[1]), ])
  
  if(length(list_pcr_data[sapply(list_pcr_data, nrow) == 0]) == length(unique(pcr_data[[name_col_primer_pcr]])))
    list_pcr_data = split(pcr_data, pcr_data[[name_col_primer_pcr]])
  
  else if(length(list_pcr_data[sapply(list_pcr_data, nrow) == 0]) != 0) {
    
    for(j in 1:length(list_pcr_data[sapply(list_pcr_data, nrow) == 0])){
      
      list_pcr_data[sapply(list_pcr_data, nrow) == 0][j] = pcr_data[which(pcr_data[[name_col_primer_pcr]] == 
                                                                            names(list_pcr_data[sapply(list_pcr_data, nrow) == 0][j])), ]
      
    }
    
  }
  
  for(i in 1:length(list_pcr_data)){
    
    orientation = unique(list_pcr_data[[i]][[name_col_orientation_pcr]])
    
    reference_primer = reference_data[which(reference_data[[name_col_primer_ref]] == names(list_pcr_data)[i]), ]
    
    if(orientation == "1 x 2"){
      
      forward_primer = reference_primer[[name_col_forward_ref]]
      
      reverse_primer = reference_primer[[name_col_reverse_ref]]
      
    }
    
    else if(orientation == "2 x 1") {
      
      forward_primer = reference_primer[[name_col_reverse_ref]]
      
      reverse_primer = reference_primer[[name_col_forward_ref]]
      
    }
    
    else stop(paste0('As only one forward and one reverse primers can be provided, "orientation" must be in "1 x 2" or "2 x 1".\nPlease check if the ', 
                     name_col_orientation_pcr,  ' column of the pcr dataframe contains only those values.'))
    
    list_pcr_data[[i]]$SEQUENCES = substring(list_pcr_data[[i]]$SEQUENCES, nchar(forward_primer) + 1, 
                                             nchar(list_pcr_data[[i]]$SEQUENCES))
    
    list_pcr_data[[i]]$SEQUENCES = substring(list_pcr_data[[i]]$SEQUENCES, 1, 
                                             nchar(list_pcr_data[[i]]$SEQUENCES) - nchar(reverse_primer))
    
  }
  
  final_pcr_data = do.call("rbind", list_pcr_data)
  
  tibble(final_pcr_data)
  
}
Eliot-RUIZ/eDNAevaluation documentation built on Dec. 17, 2021, 6:25 p.m.