"step7" = function(taxon.subset, dis.table, all.genus) { dis.table <- dis.table[dimnames(taxon.subset)[[1]], dimnames(taxon.subset)[[1]]] taxon.level <- unique(all.genus) taxon.seq.new <- vector("list", length(taxon.level)) names(taxon.seq.new) <- taxon.level for(i in 1:length(unique(taxon.level))) { #At this stage I need to extract the dimnames for data sets with 2 or less #members for insertion into the taxon.seq.new list if(sum(all.genus == taxon.level[[i]]) <= 2) { taxon.seq.new[[i]] <- dimnames(taxon.subset)[[1]][all.genus == taxon.level[[i]]] } if(sum(all.genus == taxon.level[[i]]) > 2) { #extract subset for each family temp <- dis.table[dimnames(taxon.subset)[[1]][all.genus == taxon.level[[i]]], dimnames(taxon.subset)[[1]][all.genus == taxon.level[[i]]]] temp.bak <- temp #This statement is required to avoid problems when all of the values #are 0, which causes the clustering steps to fail if(sum(temp) == 0) { taxon.seq.new[[i]] <- as.character(dimnames(temp)[[1]]) next } #jitter the matrix to resolve any ties print("inside step7") temp.order <- matrix(0, nrow(temp), ncol(temp)) while (TRUE) { temp <- abs(jitter(temp, factor = 0.001)) int <- F for (j in 1:nrow(temp)) { temp.order[j,] <- rank(as.matrix(temp[j, ])) } tf <- unique(as.integer(temp.order) == temp.order) #print(tf) if (length(tf) == 1) { int <- T } if (length(tf) == 2) { int <- F } if (int) break } temp <- temp.bak dimnames(temp.order)[[2]] <- dimnames(temp)[[2]] dimnames(temp.order)[[1]] <- dimnames(temp)[[1]] temp.reorder <- NULL for(j in 1:ncol(temp.order)) { temp.reorder <- c(temp.reorder, dimnames(temp.order)[[1]][temp.order[, j] == 1]) } #identify any data that would have been dropped by a tie dropped.names <- setdiff(dimnames(temp)[[1]], temp.reorder) temp <- temp[c(temp.reorder, dropped.names), c(temp.reorder, dropped.names)] #reorder the matrix using the 90% quantile of the 2nd best match to establish #membership and plotting sequence. Within closely related taxa, #this level is equivalent to a species to genus level relationship temp.order <- temp.order[c(temp.reorder, dropped.names), c(temp.reorder, dropped.names)] if(sum(1 * (temp.order == 2)) != 0) { neighbor <- quantile(temp[temp.order == 2], 0.9) } neighborhood <- temp >= neighbor neighborhood <- neighborhood * 1 temp.neighborhood <- temp * neighborhood neighborhood.tdist <- dist(as.matrix(temp.neighborhood), met = "binary") neighborhood.tclust <- hclust(neighborhood.tdist, met = "compact") neighborhood.tclust <- clorder(neighborhood.tclust, apply(neighborhood, 1, function(x) sum(x))) neighborhood <- neighborhood[neighborhood.tclust$order, neighborhood.tclust$order] neighborhood.dist <- dist(as.matrix(t(neighborhood)), met = "binary") neighborhood.clust <- hclust(neighborhood.dist, met = "compact") neighborhood.clust <- clorder(neighborhood.clust, apply(neighborhood, 1, function(x) sum(x))) cutree(neighborhood.clust, h = 0.025) temp <- temp[neighborhood.tclust$order, neighborhood.tclust$order] taxon.seq.new[[i]] <- as.character(dimnames(temp)[[1]]) } } return(taxon.seq.new) }