Convert character matrix into numeric matrix

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

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  

回答1:

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.



回答2:

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) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!