[R] coerce matrix to number

Marc Schwartz (via MN) mschwartz at mn.rr.com
Tue Sep 12 19:21:37 CEST 2006


On Tue, 2006-09-12 at 18:42 +0200, Simone Gabbriellini wrote:
> Dear List,
> 
> how can I coerce a matrix like this
> 
>       [,1] [,2] [,3] [,4] [,5] [,6]
> [1,] "0"  "1"  "1"  "0"  "0"  "0"
> [2,] "1"  "0"  "1"  "0"  "0"  "0"
> [3,] "1"  "1"  "0"  "0"  "0"  "0"
> [4,] "0"  "0"  "0"  "0"  "1"  "0"
> [5,] "0"  "0"  "0"  "1"  "0"  "0"
> [6,] "0"  "0"  "0"  "0"  "0"  "0"
> 
> to be filled with numbers?
> 
> this is the result of replacing some character ("v", "d") with 0 and  
> 1, using the code I found with RSiteSearch()
> 
> z[] <- lapply(z, factor, levels = c("d", "v"), labels = c(0, 1));
> 
> thank you,
> Simone


I reverse engineered your (presumably) original data frame:

> z
  1 2 3 4 5 6
1 d v v d d d
2 v d v d d d
3 v v d d d d
4 d d d d v d
5 d d d v d d
6 d d d d d d


> str(z)
`data.frame':   6 obs. of  6 variables:
 $ 1: Factor w/ 2 levels "d","v": 1 2 2 1 1 1
 $ 2: Factor w/ 2 levels "d","v": 2 1 2 1 1 1
 $ 3: Factor w/ 2 levels "d","v": 2 2 1 1 1 1
 $ 4: Factor w/ 2 levels "d","v": 1 1 1 1 2 1
 $ 5: Factor w/ 2 levels "d","v": 1 1 1 2 1 1
 $ 6: Factor w/ 2 levels "d","v": 1 1 1 1 1 1



If that is correct, then the following should yield what you want in one
step:

> z.num <- sapply(z, function(x) as.numeric(x) - 1)

> z.num
     1 2 3 4 5 6
[1,] 0 1 1 0 0 0
[2,] 1 0 1 0 0 0
[3,] 1 1 0 0 0 0
[4,] 0 0 0 0 1 0
[5,] 0 0 0 1 0 0
[6,] 0 0 0 0 0 0

> str(z.num)
 num [1:6, 1:6] 0 1 1 0 0 0 1 0 1 0 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:6] "1" "2" "3" "4" ...



Alternatively, if you were starting out with the character matrix:

> z.char
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "0"  "1"  "1"  "0"  "0"  "0"
[2,] "1"  "0"  "1"  "0"  "0"  "0"
[3,] "1"  "1"  "0"  "0"  "0"  "0"
[4,] "0"  "0"  "0"  "0"  "1"  "0"
[5,] "0"  "0"  "0"  "1"  "0"  "0"
[6,] "0"  "0"  "0"  "0"  "0"  "0"


You could do:

> storage.mode(z.char) <- "numeric"

> z.char
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    1    0    0    0
[2,]    1    0    1    0    0    0
[3,]    1    1    0    0    0    0
[4,]    0    0    0    0    1    0
[5,]    0    0    0    1    0    0
[6,]    0    0    0    0    0    0

> str(z.char)
 num [1:6, 1:6] 0 1 1 0 0 0 1 0 1 0 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : NULL



Yet another alternative:

> matrix(as.numeric(z.char), dim(z.char))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    1    0    0    0
[2,]    1    0    1    0    0    0
[3,]    1    1    0    0    0    0
[4,]    0    0    0    0    1    0
[5,]    0    0    0    1    0    0
[6,]    0    0    0    0    0    0



HTH,

Marc Schwartz



More information about the R-help mailing list