If I have a data frame:
a b
2.4 4.6
3.6 66.7
5.8 44.6
Both a and b are numeric.
I want to convert "." to "," with
df$a <- as.numeric(gsub(".", ",", df$a))
but I always get
Warning message:NAs introduced by coercion
and all values are converted to NA. Why?
If you need to replace the full stop with a comma in an excel spreadsheet, use edit / find. Highlight the range in which you need to replace, use "edit" "find" and enter full stop and comma, then click on replace.
Your initial idea was almost correct, just regular expression was wrong, because .
matches any symbol. You need something like (this will convert numeric vector to a character vector)
df$a <- gsub("\\.", ",", df$a)
Also you can change the output from R printing, plotting and the actions of the as.character function. You change it from its default with:
options(OutDec= ",")
And another option is using format
function.
format(df, decimal.mark=",")
I assume that you care about how numbers are printed (output), because internally numeric is stored as a double precision floating point number (Update thanks to comment by @digemall). Also unless for some function like read.table
it is specifically specified that decimal separator is ,
, it's not possible to do otherwise, because by default ,
is used for separating function arguments.
And NA
are introduced exactly for that reason (aside from incorrect regex).
df$a <- as.numeric(gsub("\\.", ",", df$a))
By default parser does not know that ,
is used as a decimal separator.
If you only want commas for printing, you can use format:
data <- data.frame(a=rnorm(5), b=rnorm(5))
format(data, decimal.mark=",")
a b
1 1,058878354 0,1812629
2 1,026163906 -0,6666500
3 1,538423889 -1,4206752
4 -0,561585916 -0,4729558
5 -0,004685406 1,0744514
However this will only change how they look. You will still have to use dots in assigns.
Are you on OSX or Windows or ...?
To change the representation, you want to look at the LC_NUMERIC
parameter, although R documentation warns that changing this may cause R to operate strangely (hard to use ,
as decimal when it is also used to define lists...)
> Sys.getlocale("LC_NUMERIC")
[1] "C"
> a=c(1.01,2.01)
> a
[1] 1.01 2.01
> Sys.setlocale("LC_NUMERIC", "de_DE") # this is OSX syntax
> a
[1] 1,01 2,01
Might be safer just to live with it!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With