[R] index vector

Marc Schwartz (via MN) mschwartz at mn.rr.com
Fri Sep 29 22:54:43 CEST 2006


On Fri, 2006-09-29 at 16:13 -0400, bertrand toupin wrote:
> Hi!  1st time I'm posting here.  I'm beginning to learn R and I've
> encountered a problem that I'm unable to solve so far.
> 
> I have  a 20 000 x 5 matrix.  In the 5th column, I have elevation.
> Missing value are actually put to -99999.  I want to track down the
> index of those values and replace them with NA.  I've read that to
> replace, the command "replace" is enough.  I just don't know how to
> construct the index vector that contains the index of -99999 values.
> 
> Hope this makes sense,
> Thanks!
> Philippe


See ?is.na and note the use of:

  is.na(x) <- value


Example:

> mat <- matrix(sample(50), 10, 5)

> mat
      [,1] [,2] [,3] [,4] [,5]
 [1,]   24   39   40   30    5
 [2,]    8   44    3   34   47
 [3,]   23   12   16   14   45
 [4,]   35   26    2   11    6
 [5,]   13   15   42   33   19
 [6,]    7   36   31   49   37
 [7,]   29   41    9   27    4
 [8,]   48    1   22   25   17
 [9,]   43   32   28   38   20
[10,]   18   50   46   21   10


# Set some values in column 5 to -99999
> mat[sample(10, 3), 5] <- -99999


> mat
      [,1] [,2] [,3] [,4]   [,5]
 [1,]   24   39   40   30      5
 [2,]    8   44    3   34     47
 [3,]   23   12   16   14     45
 [4,]   35   26    2   11      6
 [5,]   13   15   42   33 -99999
 [6,]    7   36   31   49 -99999
 [7,]   29   41    9   27      4
 [8,]   48    1   22   25     17
 [9,]   43   32   28   38     20
[10,]   18   50   46   21 -99999

# Use which to get the indices within column 5
# of those values which are -99999
# See ?which
> which(mat[, 5] == -99999)
[1]  5  6 10


# Now extend that and set those to NA
> is.na(mat[, 5]) <- which(mat[, 5] == -99999)

> mat
      [,1] [,2] [,3] [,4] [,5]
 [1,]   24   39   40   30    5
 [2,]    8   44    3   34   47
 [3,]   23   12   16   14   45
 [4,]   35   26    2   11    6
 [5,]   13   15   42   33   NA
 [6,]    7   36   31   49   NA
 [7,]   29   41    9   27    4
 [8,]   48    1   22   25   17
 [9,]   43   32   28   38   20
[10,]   18   50   46   21   NA



Note one other possibility, which is that if you used one of the
read.table() family functions to read in a delimited ASCII file
containing the data set, you can set the 'na.strings' argument to
"-99999" and have it set these to NA upon importing.  See ?read.table
for more information.

HTH,

Marc Schwartz



More information about the R-help mailing list