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