Luigi Marongiu
2015-Jul-15 10:26 UTC
[R] convert character vector to decimal for numeric testing
Dear all, I have a vector that comes from some calculations I am making and this vectors turns out to be in character format rather than numerical. I can convert it in numerical format but then the calculations are not correct, as you can see in the following example. I was also expecting that rounding a number such as 5.43 to a three digits one would return 5.430 but that did not happen. Any tips on how to apply the calculation correctly? Thank you best regards luigi>>>vec.ori <- c("5.43", "6.63", "-1.18593063116494e+36", "6.2", "5.61", "4.96842801255869e+30", "5.59", "-Inf", "Inf", "5.49", "18.35", "-3.11", "6.07", NA) vec.num <- as.numeric(vec.ori) vec.num <0 [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE NA vec.num >0 [1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE NA for(i in 1:length(vec.num)) { cat("value at beginning: ", vec.num[i], "\n", sep="") if(vec.num[i] < 0) { vec.num[i] <- "LO" } else if(vec.num[i] > 45) { vec.num[i] <- "HI" } else if (is.na(vec.num[i])== TRUE) { vec.num[i] <- "na" } else if (is.infinite(vec.num[i]) == TRUE) { vec.num[i] <- "INF" } else { vec.num[i] <- round(vec.num[i], 3) } cat("value at end: ", vec.num[i], "\n", sep="") } value at beginning: 5.43 value at end: 5.43 value at beginning: 6.63 value at end: 6.63 value at beginning: -1185930631164940020264024442864400022 value at end: LO # REM: error! value at beginning: 6.2 value at end: HI # REM: error! value at beginning: 5.61 value at end: HI # REM: error! value at beginning: 4968428012558689723622822000404 value at end: HI value at beginning: 5.59 value at end: HI # REM: error! value at beginning: -Inf value at end: LO # REM: error! value at beginning: Inf value at end: HI # REM: error! value at beginning: 5.49 value at end: HI # REM: error! value at beginning: 18.35 Error in round(vec.num[i], 3) : non-numeric argument to mathematical function # REM: cycle crashed
jim holtman
2015-Jul-15 12:43 UTC
[R] convert character vector to decimal for numeric testing
It does round to 3 digits, but since the last one is a zero, is only prints 5.43 and not 5.430. Why do you want the last zero? Is this going into a report or something? You can always use sprintf:> x <-round(5.43, 3) > x[1] 5.43> sprintf("%.3f", x)[1] "5.430">BTW you are converting your numeric vector back to character with statements like: if(vec.num[i] < 0) { vec.num[i] <- "LO" What is the problem you are trying to solve? Jim Holtman Data Munger Guru What is the problem that you are trying to solve? Tell me what you want to do, not how you want to do it. On Wed, Jul 15, 2015 at 6:26 AM, Luigi Marongiu <marongiu.luigi at gmail.com> wrote:> Dear all, > I have a vector that comes from some calculations I am making and this > vectors turns out to be in character format rather than numerical. I > can convert it in numerical format but then the calculations are not > correct, as you can see in the following example. I was also expecting > that rounding a number such as 5.43 to a three digits one would return > 5.430 but that did not happen. Any tips on how to apply the > calculation correctly? > Thank you > best regards > luigi > > >>> > vec.ori <- c("5.43", "6.63", "-1.18593063116494e+36", "6.2", "5.61", > "4.96842801255869e+30", "5.59", "-Inf", "Inf", "5.49", "18.35", > "-3.11", "6.07", NA) > > vec.num <- as.numeric(vec.ori) > > vec.num <0 > > [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE > TRUE FALSE NA > > vec.num >0 > > [1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE > FALSE TRUE NA > > for(i in 1:length(vec.num)) { > cat("value at beginning: ", vec.num[i], "\n", sep="") > if(vec.num[i] < 0) { > vec.num[i] <- "LO" > } else if(vec.num[i] > 45) { > vec.num[i] <- "HI" > } else if (is.na(vec.num[i])== TRUE) { > vec.num[i] <- "na" > } else if (is.infinite(vec.num[i]) == TRUE) { > vec.num[i] <- "INF" > } else { > vec.num[i] <- round(vec.num[i], 3) > } > cat("value at end: ", vec.num[i], "\n", sep="") > } > > value at beginning: 5.43 > value at end: 5.43 > value at beginning: 6.63 > value at end: 6.63 > value at beginning: -1185930631164940020264024442864400022 > value at end: LO # REM: error! > value at beginning: 6.2 > value at end: HI # REM: error! > value at beginning: 5.61 > value at end: HI # REM: error! > value at beginning: 4968428012558689723622822000404 > value at end: HI > value at beginning: 5.59 > value at end: HI # REM: error! > value at beginning: -Inf > value at end: LO # REM: error! > value at beginning: Inf > value at end: HI # REM: error! > value at beginning: 5.49 > value at end: HI # REM: error! > value at beginning: 18.35 > Error in round(vec.num[i], 3) : > non-numeric argument to mathematical function > # REM: cycle crashed > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >[[alternative HTML version deleted]]