# [R] Matrix interesting question!

Jim Lemon jim at bitwrit.com.au
Sat May 29 09:15:45 CEST 2010

```On 05/29/2010 02:30 AM, UM wrote:
>
> hi,
> I have been trying to do this in R (have implemented it in Excel) but I have
> been using a very inefficent way (loops etc.). I have matrix A (columns are
> years and ages are rows)  and matrix B (columns are birth yrs and rows are
> ages)
>
>
> I would like to first turn matrix A into matrix B
>
> And then I would like to convert matrix B back again to the original matrix
> A. (I have left out details of steps) but this is the gist of what I want to
> do. Can anyone please give any insights?
>
>
Hi UM,
The answer is somewhat trivial (see below) but my initial
misunderstanding of the question led me to write a function that I have
often wanted. When using an "apply" family function, I sometimes want to
apply a different argument to each slice of the object. I'm pretty sure
that this has been done before, and I even looked through the "plyr"
package but couldn't find what I wanted. Here's an example for a data frame.

dfapply2<-function(x,FUN,args) {
dimx<-dim(x)
newx<-list()
for(column in 1:dimx)
newx[[column]]<-do.call(FUN,list(x[column],args[column]))
names(newx)<-names(x)
return(as.data.frame(newx))
}

Pretty rough, but it does apply the arguments in "args" to the
respective columns. So, thanks for motivating me to program this.

Jim

digahole<-function(x) {
dimx<-dim(x)
years<-as.numeric(colnames(x))
ages<-as.numeric(rownames(x))
minby<-min(years)-max(ages)
maxby<-max(years)-min(ages)
newx<-matrix(NA,nrow=dimx,ncol=1+maxby-minby)
rownames(newx)<-rownames(x)
colnames(newx)<-minby:maxby
oldrow<-rep(1:dimx,each=dimx)
oldcol<-rep(1:dimx,dimx)
newcol<-oldcol+rep(max(ages)-ages,each=dimx)
for(element in 1:length(oldrow))
newx[oldrow[element],newcol[element]]<-x[oldrow[element],oldcol[element]]
return(newx)
}

fillitup<-function(x) {
dimx<-dim(x)
byears<-as.numeric(colnames(x))
ages<-as.numeric(rownames(x))
minyr<-min(byears)+max(ages)
maxyr<-max(byears)+min(ages)
oldx<-matrix(NA,nrow=dimx,ncol=1+maxyr-minyr)
rownames<-rownames(x)
colnames<-minyr:maxyr
for(row in 1:dimx) oldx[row,]<-x[row,which(!is.na(x[row,]))]
return(oldx)
}

fillitup(digahole(A))

```