Convert character matrix into numeric matrix

matrix, r

Solution

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 `NA`s.

Problem

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: ``` extra4 <- matrix( 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" ), nrow = 7L, ncol = 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 ```

Original source