Jerry.Shad Jerry.Shad - 13 days ago 6
R Question

How to normalize rather long decimal number in R?

I have list of data.frame, where I need to do transformation for

.score
column. However, I implemented helper function for this transformation. After I call
.helperFunc
for my input list of data.frame, but I got weird pvalue format in first, third data.frame. How to normalize rather big decimal to simple scientific number ? Can anyone tell me how to make this happen easily ?

toy data :

savedDF <- list(
bar = data.frame(.start=c(12,21,37), .stop=c(14,29,45), .score=c(5,69,14)),
cat = data.frame(.start=c(18,42,18,42,81), .stop=c(27,46,27,46,114), .score=c(15,5,15,5,134)),
foo = data.frame(.start=c(3,3,33,3,33,91), .stop=c(26,26,42,26,42,107), .score=c(22,22,6,22,6,7))
)


so I implement helper function to convert p-value as follows :

.helperFunc <- function(obj, pvalueBase=1L, ...) {
# input param check
if(is.null(obj$p.value)) {
p.value <- 10^(obj$.score/(- pvalueBase))
obj$p.value <- p.value
} else {
stop("error, missing pvalue")
}
return(obj)
}

.savedDF <- lapply(savedDF, .helperFunc)


I got this weird output:

> .savedDF
$bar
.start .stop .score p.value
1 12 14 5 0.000010000000000000000817488438054070343241619411855936050415039062500
2 21 29 69 0.000000000000000000000000000000000000000000000000000000000000000000001
3 37 45 14 0.000000000000009999999999999999990459020882127560980734415352344512939

$cat
.start .stop .score p.value
1 18 27 15 1e-15
2 42 46 5 1e-05
3 18 27 15 1e-15
4 42 46 5 1e-05
5 81 114 134 1e-134

$foo
.start .stop .score p.value
1 3 26 22 0.0000000000000000000001
2 3 26 22 0.0000000000000000000001
3 33 42 6 0.0000010000000000000000
4 3 26 22 0.0000000000000000000001
5 33 42 6 0.0000010000000000000000
6 91 107 7 0.0000001000000000000000


I don't know what happen this, only second data.frame' format is desired. How can I normalize p.value column as simple as possible ?

last column of
cat
is considered to be desired format, or more precise but simple scientific number is also fit for me.

How can I make this normalization for unexpectedly long decimal numbers ? How can I achieve my desired output ? Any idea ? Thanks a lot

Answer

0 is the default scipen option. (See ?options for more details.) You apparently have changed the option to 100, which tells R to use decimal notation unless it is 100 characters longer than scientific notation. To get back to the default, run the line

options(scipen = 0)

As to "So in my function, I could add this option as well?" - you shouldn't do that. Doing it in your script is fine, but not in a function. Functions really shouldn't set user options. That's likely how you got in to this mess - some function you used probably rudely ran options(scipen = 100) and changed your options without you being aware.

Related: the opposite question How to disable scientific notation in R?

Comments