user2132627
user2132627

Reputation: 31

Replacing row-values in matrix by its row index

I use a r-matrix (for example [[0,0,0,1],[0,1,0,1],[1,0,0,0],[0,0,1,1]]) representing a raster. I'd like to replace every value except 0 with its row index value. Is there something like

matrix[matrix==1] <- row_index

so that my result would look like [[0,0,0,1],[0,2,0,2],[3,0,0,0],[0,0,4,4]]?

I am using R 2.15.1 on a Mac (10.7.5) and RPY2 2.2.6 to start the R-Methods. Or is there any other way to get reasonable results for statistical functions like histogram, chi_square etc.?

Upvotes: 3

Views: 2672

Answers (3)

JWLM
JWLM

Reputation: 442

Maybe I'm missing the point of your question, but how about

> m <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1),
+             nrow = 4, byrow = TRUE)
> m * 1:nrow(m)
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    2    0    2
[3,]    3    0    0    0
[4,]    0    0    4    4
>

(ETA: R fills in matrices by column, and the itemwise product operator makes the two matrices involved conformant by replicating them column by column until they fit. The * operator here winds up multiplying each item by the row to which it belongs.)

Upvotes: 0

Josh O&#39;Brien
Josh O&#39;Brien

Reputation: 162321

For a succinct, expressive solution, I'd be likely to use this:

m <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
            nrow = 4, byrow = TRUE)

m[m!=0] <- row(m)[m!=0]
m
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    2    0    2
# [3,]    3    0    0    0
# [4,]    0    0    4    4

Upvotes: 5

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193517

Hopefully all hell won't break loose for suggesting a for loop, but we'll see:

Here's your matrix

mymat <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
                nrow = 4, byrow = TRUE)
mymat
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    1    0    1
# [3,]    1    0    0    0
# [4,]    0    0    1    1

Here's a for loop that uses basic subsetting to identify the cases you want to replace.

for (i in 1:nrow(mymat)) {
  mymat[i, ][mymat[i, ] != 0] <- i
}

Here's the result.

mymat
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    2    0    2
# [3,]    3    0    0    0
# [4,]    0    0    4    4

Upvotes: 2

Related Questions