12

Even though my Windows 7 locale settings specify using "," as a decimal separator, R and RStudio give me a "." separator. Is there any way to change this? Note the "LC_NUMERIC=C" setting in the locale below: this seems to be forced by R or RStudio.

As I am in the middle of a long project, I am unwilling to change right away to R 3.0 and the last RStudio version. Does anybody know is there is any change regarding the decimal separator issue in these versions?

I am using prettyNum to solve the problem for single numbers, but I don't know how to use it on a table.

sessionInfo() R version 2.15.3 (2013-03-01) Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Spanish_Argentina.1252  LC_CTYPE=Spanish_Argentina.1252   
[3] LC_MONETARY=Spanish_Argentina.1252 LC_NUMERIC=C                      
[5] LC_TIME=Spanish_Argentina.1252    

attached base packages:
[1] grid      splines   stats     graphics  grDevices utils     datasets  methods  
[9] base     

other attached packages:
 [1] ascii_2.1          randomForest_4.6-7 pander_0.3.3       fpc_2.1-5         
 [5] flexmix_2.3-10     mclust_4.0         cluster_1.14.3     MASS_7.3-23       
 [9] Gmisc_0.5.0.0      testthat_0.7       boot_1.3-7         rms_3.6-3         
[13] miscTools_0.6-16   stringr_0.6.2      Hmisc_3.10-1       survival_2.37-2   
[17] lattice_0.20-13    xtable_1.7-1       pixmap_0.4-11      RColorBrewer_1.0-5
[21] ade4_1.5-1        

loaded via a namespace (and not attached):
[1] digest_0.6.3      evaluate_0.4.3    modeltools_0.2-19 stats4_2.15.3    
[5] tools_2.15.3  
4

3 回答 3

20

The decimal separator used by the read.table and write.table functions (and most of their cousins) is set with "dec" parameter. read.csv2 is a special case where the default for dec is "," and the field separator ("sep") is set to ";".

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= ",")   # read ?options
 print( pi )
 #[1] 3,141593
 options(OutDec= ",")  # restore default value

This will NOT cause R to handle numeric input from the console differently. That is hard-coded to "." as the decimal separator.

If you applied a text function to a table object, you would be possibly coercing from a 'numeric' to a 'character' mode, since table objects in R inherit from the "matrix" class.

It should be added that the "natural" way to read data with "europian" decimal separators is to use read.delim. Not only does it change the decimal separator to "," but at the same time it changes some the parameters to something other than the default for read.table or read.csv:

sep = "\t", quote = "\"", dec = ".", fill = TRUE, comment.char = ""
于 2013-05-05T16:31:38.030 回答
3

Why do you want to use "," as decimal separator, in that case how R will interprate this R expression

x <- c(2,3) # (two vectors or one). 

So, I assume that you just want to override the default decimal separator to print an output and in this case, I think prettyNum is the right tool.

require(plyr)
head(numcolwise(prettyNum)(iris, dec = ","))

##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5,1         3,5          1,4         0,2
## 2          4,9           3          1,4         0,2
## 3          4,7         3,2          1,3         0,2
## 4          4,6         3,1          1,5         0,2
## 5            5         3,6          1,4         0,2
## 6          5,4         3,9          1,7         0,4
于 2013-05-05T13:22:13.850 回答
0

Based on the fact that you want to use it with (Pandoc) markdown as far as I can see from the blog comment where you referenced this question, I would also suggest to give a try to my pander package:

> library(pander)
> panderOptions('decimal.mark', ',')
> panderOptions('table.split.table', Inf)
> pander(head(iris))

-------------------------------------------------------------------
 Sepal.Length   Sepal.Width   Petal.Length   Petal.Width   Species 
-------------- ------------- -------------- ------------- ---------
     5,1            3,5           1,4            0,2       setosa  

     4,9             3            1,4            0,2       setosa  

     4,7            3,2           1,3            0,2       setosa  

     4,6            3,1           1,5            0,2       setosa  

      5             3,6           1,4            0,2       setosa  

     5,4            3,9           1,7            0,4       setosa  
-------------------------------------------------------------------

Or PHP Markdown Extra syntax for easier usage with knitr:

> pandoc.table(head(iris), style = 'rmarkdown')


|  Sepal.Length  |  Sepal.Width  |  Petal.Length  |  Petal.Width  |  Species  |
|:--------------:|:-------------:|:--------------:|:-------------:|:---------:|
|      5,1       |      3,5      |      1,4       |      0,2      |  setosa   |
|      4,9       |       3       |      1,4       |      0,2      |  setosa   |
|      4,7       |      3,2      |      1,3       |      0,2      |  setosa   |
|      4,6       |      3,1      |      1,5       |      0,2      |  setosa   |
|       5        |      3,6      |      1,4       |      0,2      |  setosa   |
|      5,4       |      3,9      |      1,7       |      0,4      |  setosa   |
于 2013-05-06T19:00:38.063 回答