[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[2])
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[1],ncol=1+maxby-minby)
rownames(newx)<-rownames(x)
colnames(newx)<-minby:maxby
oldrow<-rep(1:dimx[1],each=dimx[2])
oldcol<-rep(1:dimx[2],dimx[1])
newcol<-oldcol+rep(max(ages)-ages,each=dimx[1])
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[1],ncol=1+maxyr-minyr)
rownames<-rownames(x)
colnames<-minyr:maxyr
for(row in 1:dimx[1]) oldx[row,]<-x[row,which(!is.na(x[row,]))]
return(oldx)
}
fillitup(digahole(A))
More information about the R-help
mailing list