# TODO: Add comment
# 
# Author: E.Korsching  12-2025
###############################################################################



#### a custom rank function for ties regulary counted up but written as 0


rank.ek <- function(x, show=F){
	#  custom rank function for ties regulary counted up but written as 0
	# x: vector
	# return: list with two vectors corresponding to the x input vector
	#  1) logical vector with 1's at ties  and  2) a ranking vector with 0's at ties
	xlen <- length(x)
	xseq <- 1:xlen
	xlogi <- duplicated(x)
	xrank <- rank(x, ties.method="first")
	xjoin <- cbind(x=x, x.logi=xlogi, x.seq=xseq, x.r=xrank)
	xjoin <- xjoin[order(xjoin[,4]),]
	vec <- xjoin[,2]
	xjoin[,2] <- vec|c(vec[-1],vec[1])	# extend logical 1 streams by 1 to start
	xjoin <- xjoin[order(xjoin[,3]),]	# input order again
	if(show){ print(xjoin) }
	rank.adj <- xjoin[ ,4]		# create a rank scheme where ties have 0
	rank.adj[xjoin[,2]==1] <- 0
	return(list(ties=xjoin[,2], rank=rank.adj))
}


#a <- rank.ek(c(1,2,3,4,5,5,7,8,3,3), show=T)

# comment:
#c(0,0,0,1,1,0,0,1,0,0)|c(0,0,1,1,0,0,1,0,0,0)




#### analysis of rank order changes / expression matrices

matrix.rank.order.analysis <- function(x){
	# rank for every column ordered decreasingly
	# in comparison to all other columns
	# start by first column
	xc <- ncol(x)
	xr <- nrow(x)
	x <- as.matrix(x)
	zr <- matrix(0,xr,xc+1)
	zr2 <- matrix(0,xr,xc)
	zr3 <- zr2
	zr[,1] <- 1:xr
	zr[,c(2:(xc+1))] <- x[,c(1:xc)]
	for(i in 1:xc){
		zr <- zr[order(zr[,(i+1)], decreasing=T), ]
		zr2[,i] <- zr[,1]
		zr3[,i] <- zr[,(i+1)]
	}
	return(list(mat=zr[,c(2:(xc+1))], rank.mat=zr2, order.mat=zr3))
}

#a <- data.frame(a=c(1,5,7,3,0), b=c(9,0,2,1,0), c=c(2,2,4,8,5))
#a
#a1 <- matrix.rank.order.analysis(a)



