Convert character matrix into numeric matrix

I have a 7 by 31 character matrix called extra4 and its structure looks like this:

> str(extra4)
 chr [1:7, 1:31] "36.88  " " 45.48  " " 52.46  " " 111.31 " " 138.45 " " 121.09 " " 122.62" ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:7] "1990" "1991" "1992" "1993" ...
  ..$ : chr [1:31] "1" "2" "3" "4" ...

After reading similar questions in SO I've tried the following but I've failed:

>matrix(as.numeric(unlist(extra4)),nrow=nrow(extra4))
Warning message:
In matrix(as.numeric(unlist(extra4)), nrow = nrow(extra4)) :
  NAs introduced by coercion

and also I've tried

> class(extra4)<-"numeric"
Warning message:
In class(extra4) <- "numeric" : NAs introduced by coercion

> extra4<-apply(extra4, 1, as.numeric)
Warning messages:
1: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
2: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
3: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
4: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
5: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
6: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
7: In apply(extra4, 1, as.numeric) : NAs introduced by coercion

> extra4<-apply(extra4, 2, as.numeric)
There were 31 warnings (use warnings() to see them)

I've also tried changing the matrix to data frame and then doing sapply(extra4, as.numeric) but this did not work either, and I've also tried writing the data as csv but somehow the output ends up including non-numeric characters.

It's strange because especially after doing the above, only some of the numbers are turned to numeric values. However, I'm sure that all elements are character, because when I compare those which are saved and those which are not, I get

> str(extra4[1,1])
 chr "36.88  "
> str(extra4[1,2])
 chr " 19.11  "

I'm also adding the following to show my data in more detail:

> dput(extra4)
structure(c("36.88  ", " 45.48  ", " 52.46  ", " 111.31 ", 
" 138.45 ", " 121.09 ", " 122.62", " 19.11  ", " 27.97  ", 
" 37.14  ", " 47.68  ", " 60.78  ", " 35.84  ", " 38.64", 
" 56.21  ", " 74.94  ", " 92.3   ", " 118.62 ", " 138.13 ", 
" 104.65 ", " 113.98", " 30.48  ", " 51.54  ", " 61.57  ", 
" 99.87  ", " 80.9   ", " 84.97  ", " 99.34", "20.16  ", 
" 24.76  ", " 27.76  ", " 37.53  ", " 50.53  ", " 28.8   ", 
" 25.06", " 87.73  ", " 98.68  ", " 119.95 ", " 150.74 ", 
" 214.35 ", " 118.5  ", " 129.19", " 32.36  ", " 36.52  ", 
" 42.67  ", " 56.55  ", " 89.22  ", " 49.97  ", " 50.62", 
"35.09  ", " 40.77  ", " 48.43  ", " 82.61  ", " 120.1  ", 
" 72.43  ", " 76.69", " 47.21  ", " 67.25  ", " 78.62  ", 
" 66.64  ", " 83.78  ", " 127.79 ", " 154.11", " 86.1   ", 
" 127.59 ", " 164.43 ", " 249.32 ", " 312.01 ", " 272.09 ", 
" 265.68", " 83.75  ", " 118.41 ", " 171.52 ", " 229.27 ", 
" 241.63 ", " 201    ", " 213.01", " 36.63  ", " 52.1   ", 
" 66.03  ", " 101.38 ", " 126.71 ", " 95.46  ", " 110.03", 
" 57.5   ", " 75.72  ", " 101.31 ", " 147.5  ", " 171.01 ", 
" 148.66 ", " 167.93", " 29.56  ", " 38.37  ", " 48.8   ", 
" 65.5   ", " 84.77  ", " 75.2   ", " 81.27", " 77.28  ", 
" 93.7   ", " 119.62 ", " 247    ", " 301.76 ", 
" 222.52 ", " 244.46", " 45.6   ", " 54.32  ", " 87.81  ", 
" 132.93 ", " 163.62 ", " 152.99 ", " 170.85", " 27.13  ", 
" 36.96  ", " 48.94  ", " 80.01  ", " 124.07 ", " 93.49  ", 
" 105.57", " 54.55  ", " 85.93  ", " 102.3  ", " 122.7  ", 
" 168.36 ", " 151.79 ", " 169.65", " 86.19  ", " 121.82 ", 
" 191.7  ", " 247.75 ", " 260.23 ", " 196.48 ", " 243.06", 
"47.35  ", " 60.63  ", " 76.4   ", " 93.04  ", " 102.13 ", 
" 98.29  ", " 86.27", " 10.93  ", " 13.33  ", " 16.82  ", 
" 18.2   ", " 23.48  ", " 16.52  ", " 16.19", "   NA   ", 
"  NA    ", "   NA   ", "  NA    ", " 69.46  ", 
" 54.22  ", " 60.16", " 60.93  ", " 89.86  ", " 141.85 ", 
" 207.9  ", " 182.79 ", " 159.1  ", " 159.46", " 15.37  ", 
" 18.48  ", " 24.33  ", " 38.37  ", " 45.87  ", " 34.86  ", 
" 31.96", " 34.05  ", " 40.1   ", " 55.02  ", " 58.31  ", 
" 86.89  ", " 65.68  ", " 65.68", "1.51   ", " 0.93   ", 
" 1      ", " 1.78   ", " 2.8    ", " 1.56   ", 
" 1.41", " 27.15  ", " 31.37  ", " 39.46  ", " 40.33  ", 
" 61.86  ", " 45.18  ", " 57.71", " 14.74  ", " 16.3   ", 
" 25.06  ", " 31.74  ", " 37.39  ", " 27.18  ", " 30.49", 
" 3.59   ", " 4.86   ", " 5.67   ", " 6.36   ", 
" 7.6    ", " 4.8    ", " 5.5", "4.73   ", " 5.68   ", 
" 7.3    ", " 8.53   ", " 11.03  ", " 8.44   ", 
" 9.84", "16.76  ", " 24.83  ", " 32.66  ", " 46.22  ", 
" 48.01  ", " 43.44  ", " 48.29"), .Dim = c(7L, 31L), .Dimnames = list(
    c("1990", "1991", "1992", "1993", "1994", "1995", "1996"), 
    c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", 
    "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", 
    "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"
    )))

sessionInfo() gave the following:

    > sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] gdata_2.13.2

loaded via a namespace (and not attached):
[1] gtools_2.7.1 tools_3.0.0 

There isn't really a problem here at all, not with most options I tried. You are getting Warnings but these pertain to the "NA" strings, which because they aren't NA nor a number stored in a string, R doesn't know what to do with them and changes these to NA. This is all the warning is telling you. Hence

apply(extra4, 2, as.numeric)
sapply(extra4, as.numeric)
class(extra4) <- "numeric"
storage.mode(extra4) <- "numeric"

all work and all warn about the " NA " values (or variants thereof) in column 22 of extra4:

Warning message:
In storage.mode(m) <- "numeric" : NAs introduced by coercion

but these are just warnings and in this case can be ignored. If they trouble you, you could wrap the call in suppressWarnings()

> suppressWarnings(storage.mode(m) <- "numeric")

but that is dangerous as it will stop all warnings, not just the one about the NAs.


I think you can just apply:

data.matrix(frame, rownames.force = NA)

Here more info: https://stat.ethz.ch/R-manual/R-devel/library/base/html/data.matrix.html


If you have a character matrix m, i.e.

m <- matrix(data = c("1","2","3","4","5","6"), ncol = 2, nrow = 3)

Simply mapply as.numeric, i.e.

m <- mapply(m, FUN=as.numeric)

And use the data to reconstruct the matrix with the same dimensions as the original m matrix, i.e.

m <- matrix(data=m, ncol=2, nrow=3)

m <- matrix(data = c("1","2","3","4","5","6"), ncol = 2, nrow = 3)

class(m) <- "numeric"