Re: [R] coerce matrix to number

From: Marc Schwartz (via MN) <mschwartz_at_mn.rr.com>
Date: Tue 12 Sep 2006 - 17:21:37 GMT

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 ...

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 ...

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



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Wed Sep 13 03:32:41 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Tue 12 Sep 2006 - 18:30:04 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.