tags:

views:

179

answers:

3

What if one wants to apply a functon i.e. to each row of a matrix, but also wants to use as an argument for this function the number of that row. As an example, suppose you wanted to get the n-th root of the numbers in each row of a matrix, where n is the row number. Is there another way (using apply only) than column-binding the row numbers to the initial matrix, like this?

test <- data.frame(x=c(26,21,20),y=c(34,29,28))

t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1])))

P.S. Actually if test was really a matrix : test <- matrix(c(26,21,20,34,29,28),nrow=3) , rownames(test) doesn't help :( Thank you.

+3  A: 

What I usually do is to run sapply on the row numbers 1:nrow(test) instead of test, and use test[i,] inside the function:

t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))

I am not sure this is really efficient, though.

Aniko
+1  A: 

Actually, in the case of a matrix, you don't even need "apply". Just:

test^(1/row(test))

does what you want, I think. I think the "row" function is the thing you are looking for.

darrenjw
I agree, but look at the comments below the question.
Brani
Yes, but I still think the "row()" function is exactly what you need.
darrenjw
Still I can't see how can I give a `lines` command like this `lines(test[i,],c(i,i))` without an apply or a for loop. `lines(CI,row(CI))` doesn't work
Brani
If you give me an example command which does what you want, I'll see if I can re-write it. I'm still not clear what you are trying to do.
darrenjw
A: 

cbind()ing the row numbers seems a pretty straightforward approach. For a matrix (or a data frame) the following should work:

apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )

or whatever you want to plot.

Ian Saunders