Skip to content

Avoiding for loop

3 messages · Matt Crawford, Thomas Lumley, Gabor Grothendieck

#
I understand that in R, for loops are not used as often as other
languages, and am trying to learn how to avoid them.  I am wondering
if there is a more efficient way to write a certain piece of code,
which right now I can only envision as a for loop.  I have a data file
that basically looks like:
1,55
1,23
2,12
...
that defines a matrix.  Each row of the data file corresponds to a row
of the matrix, where each number in the row tells me what column a "1"
or "-1" should go into.  So the first row in the data snippet above
means that the first row of my matrix needs to have a 1 in the 1st
column, and a -1 in the 55nd column.  (And 0 elsewhere, which is
already there as I've created the matrix filled with 0s beforehand.)

So my current code looks like:
        if(nrow(rawdata) >= 1) for(i in 1:nrow(rawdata)) {
                        X[i, rawdata[i, 1]] <- 1
                        X[i, rawdata[i, 2]] <- -1
                } 

where rawdata is the original data file.
This sort of assignment happens many times in my program so any
improvement would be much appreciated.  Thanks.
#
On Thu, 4 Aug 2005, Matt Crawford wrote:

            
This may be a job for matrix indexes

    ii<-1:nrow(rawdata)
    X[cbind(ii,rawdata[,1])] <- 1
    X[cbind(ii,rawdata[,2])] <- -1


 	-thomas
#
On 8/4/05, Matt Crawford <mcrawford at gmail.com> wrote:
idx <- seq(length = max(rawdata, 0))
X <- outer(rawdata[,1], idx, "==") - outer(rawdata[,2], idx, "==")

Note that we did not have to predefine X and it also works if rawdata
has zero rows:

   rawdata <- matrix(0, nr = 0, nc = 2) 

in which case it gives a 0 by 0 matrix.