Hi, May be this helps: dat1 <- read.table(text=" a???? a???? b???? b???? c???? c x???? y???? x???? y???? x???? y 12?? 34?? 256? 25??? 5?? 32 5??? 45??? 23?? 452?? 21?? 45",sep="",header=TRUE,stringsAsFactors=FALSE,check.names=FALSE) ?mat1 <- matrix(0,5,5,dimnames=list(NULL,c("x",letters[1:4]))) ?mat1[,1]<- sort(unique(as.numeric(unlist(dat1[-1,which(dat1=="x",arr.ind=TRUE)[,2]])))) dat1New <- dat1[-1,which(dat1=="x",arr.ind=TRUE)[,2]] dat2New <- dat1[-1,which(dat1=="y",arr.ind=TRUE)[,2]] mat1[,2:4] <-sapply(seq_len(ncol(dat1New)),function(i) {x1 <-dat2New[match(mat1[,1],dat1New[,i]),i] x1[is.na(x1)] <-0 as.numeric(x1)}) ?mat1 #?????? x? a?? b? c d #[1,]?? 5 45?? 0 32 0 #[2,]? 12 34?? 0? 0 0 #[3,]? 21? 0?? 0 45 0 #[4,]? 23? 0 452? 0 0 #[5,] 256? 0? 25? 0 0 A.K. Hello everyone, I have a dataframe made as follows: a ? ? a ? ? b ? ? b ? ? c ? ? c x ? ? y ? ? x ? ? y ? ? x ? ? y 12 ? 34 ? 256 ?25 ? ?5 ? 32 5 ? ?45 ? ?23 ? 452 ? 21 ? 45 ... ? ... ? ?... ? ... ? ?... ? ?... My intention is to create just one matrix made as follows x ? ? a ? ? b ? ? c ? ? d 5 ? ? 45 ? 0 ? ? 32 ? ?0 12 ? 34 ? 0 ? ? 0 ? ? ?0 21 ? 0 ? ? 0 ? ? 45 ? ?0 23 ? 0 ? ?452 ? 0 ? ? 0 256 ?... ?... ? ? ... ? ... ... As you can see I want on the first column all the values collected from all the x columns and ordered. On the other columns I want the y-values related to every letter (a-b-c...). For example the first value on the x column is 5 (the smallest). It is present in the a x-values (first matrix) so in the second table I report its related y-value (45). However 5 is not present in the b x-values so I report a 0 on the second table. And so on. I don't know if it's a difficult task but I had several problems with the double header handling and the data. I looked for some clues on the internet but documentation is very fragmented and lacking. (So, in addition, any recommendation for good R books?)