I have two data frames/ lists of data, humanSplit and ratSplit, and they are of the form> ratSplit$Kidney_F_GSM1328570  ratGene        ratReplicate alignment RNAtype1    Crot Kidney_F_GSM1328570         7     REV2    Crot Kidney_F_GSM1328570        12     REV3    Crot Kidney_F_GSM1328570         4     REVand> humanSplit$Fetal_Brain_408_AGTCAA_L009_R1_report.txt   humanGene                            humanReplicate alignment RNAtype53     ZFP28 Fetal_Brain_408_AGTCAA_L009_R1_report.txt         5     reg55     RC3H1 Fetal_Brain_408_AGTCAA_L009_R1_report.txt         9     reg56     IFI27 Fetal_Brain_408_AGTCAA_L009_R1_report.txt         4     regAnd another file used below is geneList of the form:ABAT,AbatABCA1,Abca1ABCA12,Abca12ABCA2,Abca2ABCA3,Abca17ABCA4,Abca4ABCA5,Abca5now I want to do Fisher's exact test between all the elements pair combination between ratSplit and humanSplit after some data manipulation. And ultimately want to write the result of fisher's test in a .csv file. Right now I am doing double for loops. But I am wondering how I can use sapply or other related things to make it more efficient.I am currently doing the following thing:Here I am first making a data.frame result where I store/append all the information got from fisher's test in a pair in each step. Then finally when the whole loop is done, I write the final result in a .csv file. my understanding is to use sapply I need to transform the inside of the loop into a function and then call sapply. But I am not sure what's the best way to optimize it.result <- data.frame(humanReplicate = human_replicate, ratReplicate = rat_replicate, pvalue = p-value, alternative = alternative_hypothesis,                      Conf.int1 = conf.int1, Conf.int2 =conf.int2, oddratio = Odd_Ratio)for(i in 1:length(ratSplit)) {  for(j in 1:length(humanSplit)) {    ratReplicateName <- names(ratSplit[i])    humanReplicateName <- names(humanSplit[j])    #merging above two based on the one-to-one gene mapping as in geneList defined above.    mergedHumanData <-merge(geneList,humanSplit[[j]], by.x = human, by.y = humanGene)    mergedRatData <- merge(geneList, ratSplit[[i]], by.x = rat, by.y = ratGene)    mergedHumanData <- mergedHumanData[,c(1,2,4,5)] #rearrange column    mergedRatData <- mergedRatData[,c(2,1,4,5)]  #rearrange column    mergedHumanRatData <- rbind(mergedHumanData,mergedRatData) #now the columns are human, rat, alignment, RNAtype    agg <- aggregate(RNAtype ~ human+rat, data= mergedHumanRatData, FUN=getGeneType) #agg to make HmYn form    HmRnTable <- table(agg$RNAtype) #table of HmRn ie RNAtype in human and rat.    #now assign these numbers to variables HmYn. Consider cases when some form of HmRy is not present in the table. That's why    #is.integer0 function is used    HyRy <- ifelse(is.integer0(HmRnTable[names(HmRnTable) == HyRy]), 0, HmRnTable[names(HmRnTable) == HyRy][[1]])    HnRn <- ifelse(is.integer0(HmRnTable[names(HmRnTable) == HnRn]), 0, HmRnTable[names(HmRnTable) == HnRn][[1]])    HyRn <- ifelse(is.integer0(HmRnTable[names(HmRnTable) == HyRn]), 0, HmRnTable[names(HmRnTable) == HyRn][[1]])    HnRy <- ifelse(is.integer0(HmRnTable[names(HmRnTable) == HnRy]), 0, HmRnTable[names(HmRnTable) == HnRy][[1]])    contingencyTable <- matrix(c(HnRn,HnRy,HyRn,HyRy), nrow = 2)    fisherTest <- fisher.test(contingencyTable)     newLine <- data.frame(t(c(humanReplicate = humanReplicateName, ratReplicate = ratReplicateName, pvalue = fisherTest$p,                              alternative = fisherTest$alternative, Conf.int1 = fisherTest$conf.int[1], Conf.int2 =fisherTest$conf.int[2],                               oddratio = fisherTest$estimate[[1]])))    result <-rbind(result,newLine)  }}write.table(result, file = newData5.csv, row.names = FALSE, append = FALSE, col.names = TRUE, sep = ,)
Vectorize Fisher's Exact Test
optimization;csv;r;statistics;bioinformatics