# TODO: Add comment
# 
# Author: E.Korsching 2026
###############################################################################



#### merge columns by respecting the row.names


merge.col.by.rownames <- function(x){
	# x: get a list of objects with row.names:  data.frame columns  --  min.: 2 list elements
	#  e.g.: list(a=expA, b=expB, ... ) or list(expA, b=expB, ... )
	#  and return   a joined data frame respecting row.names
	#  row.name sets needs to be identical but order can differ
	# input object critical
	
	# ini
	l.len <- length(x)		# list length
	if(l.len<2){ stop("needs >=2 target vectors") }
	
	# column length & header
	l.ch <- vector("numeric",l.len)
	for(i in 1:l.len){
		l.ch[i] <- length(unlist( dimnames(x[[i]])[[1]] ))
	}
	l.ch.cf <- l.ch[1]		# check column length
	for(i in 1:l.len){
		if(l.ch[i]!=l.ch.cf){ stop("vector length is not always identical") }
	}
	
	n.ch <- vector("character",l.len)
	for(i in 1:l.len){
		tmp <- names(x[i])
		if(tmp==""){
			n.ch[i] <- as.character(i)
		}else{
			n.ch[i] <- tmp
		}
	}
	for(i in 1:l.len){
		n.ch[i] <- paste(n.ch[i], dimnames(x[[i]])[[2]], sep=".")
	}
	
	
	# length row.names
	l.ent <- vector("list",l.len)
	for(i in 1:l.len){
		l.ent[[i]] <- unlist( dimnames(x[[i]])[[1]] )
	}
	tmp <- unlist(l.ent)	# chain all rownames vectors one after each other
	uni.el <- unique(tmp)	# remove duplicates
	uni.el.len <- length(uni.el)
	if(uni.el.len!=l.ch.cf){ stop("there are differences between the row.names") }
	
	# create merged data.frame
	df <- data.frame(matrix(0, uni.el.len, l.len))		# will even create something with 0 rows
	dimnames(df)[[1]] <- uni.el
	dimnames(df)[[2]] <- n.ch
	for(i in 1:l.len){
		df[,i] <- x[[i]][ uni.el, 1, drop=F]
	}
	return(df)
}


#a <- list(ab=data.frame(a1=c(1,2,3), row.names=c("r1","r2","r3")),	# simple case
#		cd=data.frame(a1=c(4,5,6), row.names=c("r1","r2","r3")),
#		ef=data.frame(a1=c(7,8,9), row.names=c("r1","r2","r3")) )
#a
#
#a <- list(data.frame(a1=c(1,2,3), row.names=c("r1","r2","r3")),
#		aa=data.frame(a1=c(4,5,6), row.names=c("r1","r2","r3")),	# named + unnamed list objects
#		data.frame(a1=c(7,8,9), row.names=c("r1","r2","r3")) )
#a
#
#a <- list(data.frame(a1=c(1,2,3), row.names=c("r1","r2","r3")),
#		aa=data.frame(a1=c(4,5,6), row.names=c("r3","r1","r2")),	# order changed
#		data.frame(a1=c(7,8,9), row.names=c("r1","r2","r3")) )
#a
#
#a <- list(data.frame(a1=c(1,2,3), row.names=c("hsa-miR-22-3p","hsa-miR-23a-3p","hsa-miR-184")),
#		aa=data.frame(a1=c(4,5,6), row.names=c("hsa-miR-184","hsa-miR-22-3p","hsa-miR-23a-3p")),	# order changed
#		data.frame(a1=c(7,8,9), row.names=c("hsa-miR-22-3p","hsa-miR-23a-3p","hsa-miR-184")) )
#a

#merge.col.by.rownames(a)




##justified by:
#cbind(data.frame(a1=c(1,2,3), row.names=c("r1","r2","r3")),
#		data.frame(a1=c(4,5,6), row.names=c("r3","r1","r2")),	# order changed
#		data.frame(a1=c(7,8,9), row.names=c("r1","r2","r3")) )
## row order error

















