ivan popivanov
2010-Jan-17 22:17 UTC
[R] How to convert character matrix or data.frame to numeric?
Hello, This turned out to be surprisingly hard for me: Let's say I have mm = matrix(as.character(seq(1,30, 1)), nrow=3); mm [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] "1" "4" "7" "10" "13" "16" "19" "22" "25" "28" [2,] "2" "5" "8" "11" "14" "17" "20" "23" "26" "29" [3,] "3" "6" "9" "12" "15" "18" "21" "24" "27" "30" which is a matrix of strings, I'd like to convert this to a matrix of the corresponding numbers: nn = matrix(seq(1,30, 1), nrow=3), nn [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 4 7 10 13 16 19 22 25 28 [2,] 2 5 8 11 14 17 20 23 26 29 [3,] 3 6 9 12 15 18 21 24 27 30 I can convert each dimension using sapply(mm[,1], as.numeric), but how to convert the full matrix?! In fact I hit this problem because I got a data.frame consisting of factors (numerics represented as strings) when I queried a database. So if you can advise how to convert this data.frame to a data.frame with proper numerics - that would be even better. The problem is that my numerics are doubles and the data.matrix function seems to cast factors to ints. Thanks in advance, Ivan _________________________________________________________________ [[alternative HTML version deleted]]
Gabor Grothendieck
2010-Jan-17 22:21 UTC
[R] How to convert character matrix or data.frame to numeric?
Try this: class(mm) <- "numeric" On Sun, Jan 17, 2010 at 5:17 PM, ivan popivanov <ivan.popivanov at hotmail.com> wrote:> > Hello, > > > > This turned out to be surprisingly hard for me: > > > > Let's say I have > > > > mm = matrix(as.character(seq(1,30, 1)), nrow=3); mm > > ? ? [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] "1" ?"4" ?"7" ?"10" "13" "16" "19" "22" "25" "28" > [2,] "2" ?"5" ?"8" ?"11" "14" "17" "20" "23" "26" "29" > [3,] "3" ?"6" ?"9" ?"12" "15" "18" "21" "24" "27" "30" > > > > which is a matrix of strings, I'd like to convert this to a matrix of the corresponding numbers: > > > > nn = matrix(seq(1,30, 1), nrow=3), nn > > ? ? [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] ? ?1 ? ?4 ? ?7 ? 10 ? 13 ? 16 ? 19 ? 22 ? 25 ? ?28 > [2,] ? ?2 ? ?5 ? ?8 ? 11 ? 14 ? 17 ? 20 ? 23 ? 26 ? ?29 > [3,] ? ?3 ? ?6 ? ?9 ? 12 ? 15 ? 18 ? 21 ? 24 ? 27 ? ?30 > > > > I can convert each dimension using sapply(mm[,1], as.numeric), but how to convert the full matrix?! > > > > In fact I hit this problem because I got a data.frame consisting of factors (numerics represented as strings) when I queried a database. So if you can advise how to convert this data.frame to a data.frame with proper numerics - that would be even better. The problem is that my numerics are doubles and the data.matrix function seems to cast factors to ints. > > > > Thanks in advance, > > Ivan > > > > _________________________________________________________________ > > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org 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. >
Ben Tupper
2010-Jan-17 22:33 UTC
[R] How to convert character matrix or data.frame to numeric?
Hi, I find the following works in R 2.10.1 on Mac OSX. > m = matrix(rep("3", 30), 5,6) > m [,1] [,2] [,3] [,4] [,5] [,6] [1,] "3" "3" "3" "3" "3" "3" [2,] "3" "3" "3" "3" "3" "3" [3,] "3" "3" "3" "3" "3" "3" [4,] "3" "3" "3" "3" "3" "3" [5,] "3" "3" "3" "3" "3" "3" > apply(m, 1,as.numeric) [,1] [,2] [,3] [,4] [,5] [1,] 3 3 3 3 3 [2,] 3 3 3 3 3 [3,] 3 3 3 3 3 [4,] 3 3 3 3 3 [5,] 3 3 3 3 3 [6,] 3 3 3 3 3 Cheers, Ben On Jan 17, 2010, at 5:17 PM, ivan popivanov wrote:> > Hello, > > > > This turned out to be surprisingly hard for me: > > > > Let's say I have > > > > mm = matrix(as.character(seq(1,30, 1)), nrow=3); mm > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] "1" "4" "7" "10" "13" "16" "19" "22" "25" "28" > [2,] "2" "5" "8" "11" "14" "17" "20" "23" "26" "29" > [3,] "3" "6" "9" "12" "15" "18" "21" "24" "27" "30" > > > > which is a matrix of strings, I'd like to convert this to a matrix > of the corresponding numbers: > > > > nn = matrix(seq(1,30, 1), nrow=3), nn > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] 1 4 7 10 13 16 19 22 25 28 > [2,] 2 5 8 11 14 17 20 23 26 29 > [3,] 3 6 9 12 15 18 21 24 27 30 > > > > I can convert each dimension using sapply(mm[,1], as.numeric), but > how to convert the full matrix?! > > > > In fact I hit this problem because I got a data.frame consisting of > factors (numerics represented as strings) when I queried a database. > So if you can advise how to convert this data.frame to a data.frame > with proper numerics - that would be even better. The problem is > that my numerics are doubles and the data.matrix function seems to > cast factors to ints. > > > > Thanks in advance, > > Ivan > > > > _________________________________________________________________ > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org 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.Cheers, Ben
Rolf Turner
2010-Jan-17 22:34 UTC
[R] How to convert character matrix or data.frame to numeric?
In respect of your matrix problem: (1) mode(mm) <- "numeric" OR: (2) mm <- apply(mm,2,as.numeric) In respect of your data frame problem: as.data.frame(lapply(X,as.numeric)) (where X is your data frame) should work. This will of course convert every column of your data frame to numeric mode. If there are some columns that you wish to leave alone you will have to do something a little bit more subtle. But not much more subtle. It's all pretty easy if you learn some basic R syntax. cheers, Rolf Turner On 18/01/2010, at 11:17 AM, ivan popivanov wrote:> > Hello, > > > > This turned out to be surprisingly hard for me: > > > > Let's say I have > > > > mm = matrix(as.character(seq(1,30, 1)), nrow=3); mm > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] "1" "4" "7" "10" "13" "16" "19" "22" "25" "28" > [2,] "2" "5" "8" "11" "14" "17" "20" "23" "26" "29" > [3,] "3" "6" "9" "12" "15" "18" "21" "24" "27" "30" > > > > which is a matrix of strings, I'd like to convert this to a matrix > of the corresponding numbers: > > > > nn = matrix(seq(1,30, 1), nrow=3), nn > > [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] > [1,] 1 4 7 10 13 16 19 22 25 28 > [2,] 2 5 8 11 14 17 20 23 26 29 > [3,] 3 6 9 12 15 18 21 24 27 30 > > > > I can convert each dimension using sapply(mm[,1], as.numeric), but > how to convert the full matrix?! > > > > In fact I hit this problem because I got a data.frame consisting of > factors (numerics represented as strings) when I queried a > database. So if you can advise how to convert this data.frame to a > data.frame with proper numerics - that would be even better. The > problem is that my numerics are doubles and the data.matrix > function seems to cast factors to ints. > > > > Thanks in advance, > > Ivan > > > > _________________________________________________________________ > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org 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.###################################################################### Attention:\ This e-mail message is privileged and confid...{{dropped:9}}
Ben Tupper
2010-Jan-17 23:21 UTC
[R] How to convert character matrix or data.frame to numeric?
Hello again, On Jan 17, 2010, at 5:42 PM, Rolf Turner wrote:> > > Notice that your output is 6 x 5 whereas your input is 5 x 6. > Now *what* did you do wrong? >Whoa! Let's try that again, but with a better example. > X = matrix(as.character(1:6),2,3) > X [,1] [,2] [,3] [1,] "1" "3" "5" [2,] "2" "4" "6" > apply(X,1,as.numeric) [,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6 Ouch! Hmmm. From the "Value" section of the apply docs... "If each call to FUN returns a vector of length n, then apply returns an array of dimension c(n, dim(X)[MARGIN]) if n > 1." Since I set MARGIN to 1, then I was operating on rows where n is 3. > c(n, dim(X)[MARGIN]) [1] 3 2 How about that; it does just what it says it will do. I have no idea why it does that, but the remedy seems to be ... > apply(X, c(1,2), as.numeric) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 ... or even ... > apply(X, 2, as.numeric) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 Perhaps someone could shed light on why the rows become columns. Cheers, Ben> cheers, > > Rolf Turner > > On 18/01/2010, at 11:33 AM, Ben Tupper wrote: > >> Hi, >> >> I find the following works in R 2.10.1 on Mac OSX. >> >>> m = matrix(rep("3", 30), 5,6) >>> m >> [,1] [,2] [,3] [,4] [,5] [,6] >> [1,] "3" "3" "3" "3" "3" "3" >> [2,] "3" "3" "3" "3" "3" "3" >> [3,] "3" "3" "3" "3" "3" "3" >> [4,] "3" "3" "3" "3" "3" "3" >> [5,] "3" "3" "3" "3" "3" "3" >>> apply(m, 1,as.numeric) >> [,1] [,2] [,3] [,4] [,5] >> [1,] 3 3 3 3 3 >> [2,] 3 3 3 3 3 >> [3,] 3 3 3 3 3 >> [4,] 3 3 3 3 3 >> [5,] 3 3 3 3 3 >> [6,] 3 3 3 3 3 >> >> Cheers, >> Ben >> On Jan 17, 2010, at 5:17 PM, ivan popivanov wrote: >> >>> >>> Hello, >>> >>> >>> >>> This turned out to be surprisingly hard for me: >>> >>> >>> >>> Let's say I have >>> >>> >>> >>> mm = matrix(as.character(seq(1,30, 1)), nrow=3); mm >>> >>> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] >>> [1,] "1" "4" "7" "10" "13" "16" "19" "22" "25" "28" >>> [2,] "2" "5" "8" "11" "14" "17" "20" "23" "26" "29" >>> [3,] "3" "6" "9" "12" "15" "18" "21" "24" "27" "30" >>> >>> >>> >>> which is a matrix of strings, I'd like to convert this to a matrix >>> of the corresponding numbers: >>> >>> >>> >>> nn = matrix(seq(1,30, 1), nrow=3), nn >>> >>> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] >>> [1,] 1 4 7 10 13 16 19 22 25 28 >>> [2,] 2 5 8 11 14 17 20 23 26 29 >>> [3,] 3 6 9 12 15 18 21 24 27 30 >>> >>> >>> >>> I can convert each dimension using sapply(mm[,1], as.numeric), but >>> how to convert the full matrix?! >>> >>> >>> >>> In fact I hit this problem because I got a data.frame consisting of >>> factors (numerics represented as strings) when I queried a database. >>> So if you can advise how to convert this data.frame to a data.frame >>> with proper numerics - that would be even better. The problem is >>> that my numerics are doubles and the data.matrix function seems to >>> cast factors to ints. >>> >>> >>> >>> Thanks in advance, >>> >>> Ivan >>> >>> >>> >>> _________________________________________________________________ >>> >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help at r-project.org 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. >> >> >> Cheers, >> Ben >> >> ______________________________________________ >> R-help at r-project.org 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. > > > ###################################################################### > Attention:This e-mail message is privileged and confidential. If you > are not theintended recipient please delete the message and notify > the sender.Any views or opinions presented are solely those of the > author. > > This e-mail has been scanned and cleared by > MailMarshalwww.marshalsoftware.com > ######################################################################Cheers, Ben