Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gsub to remove unwanted precision

Tags:

string

r

gsub

Could anyone please help to achieve the following with gsub in R?

input string: a=5.00,b=120,c=0.0003,d=0.02,e=5.20, f=1200.0,g=850.02
desired output: a=5,b=120,c=0.0003,d=0.02,e=5.2, f=1200, g=850.02

Practically, removing the redundant 0s after the decimal point if they are all just 0s, don't remove if real fractions exist.

like image 324
Tamas Avatar asked Mar 07 '23 05:03

Tamas


2 Answers

I couldn't get this to work using gsub alone, but we can try splitting your input vector on comma, and then using an apply function with gsub:

x <- "a=5.00,b=120,c=0.0003,d=0.02,e=5.20, f=1200.0,g=850.02"
input <- sapply(unlist(strsplit(x, ",")), function(x) gsub("(?<=\\d)\\.$", "", gsub("(\\.[1-9]*)0+$", "\\1", x), perl=TRUE))
input <- paste(input, collapse=",")
input

[1] "a=5,b=120,c=0.0003,d=0.02,e=5.2, f=1200,g=850.02"

Demo

I actually make two calls to gsub. The first call strips off all trailing zeroes appearing after a decimal point, should the number have one. And the second call removes stray decimal points, in the case of a number like 5.00, which the first call would leave as 5. and not 5, the latter which we want.

like image 188
Tim Biegeleisen Avatar answered Mar 31 '23 06:03

Tim Biegeleisen


To remove trailing 0s after the decimal, try this:

EDIT Forgot 5.00

x = c('5.00', '0.500', '120', '0.0003', '0.02', '5.20', '1200', '850.02')
gsub("\\.$" "", gsub("(\\.(|[1-9]+))0+$", "\\1", x))
# [1] "5"    "0.5"    "120"    "0.0003" "0.02"   "5.2"    "1200"   "850.02"

HT @TimBiegeleisen: I misread input as a vector of strings. For a single-string input, convert to vector of strings, which you can call gsub on, then collapse output back to a single string:

paste(
    gsub("\\.$", "", gsub("(\\.(|[1-9]+))0+$", "\\1",
    unlist(strsplit(x, ", ")))), 
        collapse=", ")

[1] "a=5, b=0.5, c=120, d=0.0003, e=0.02, f=5.2, g=1200, h=850.02"

like image 23
juan Avatar answered Mar 31 '23 05:03

juan