[R] Formatting digits in a table with mix of numbers and characters

Marc Schwartz marc_schwartz at me.com
Thu Nov 8 18:54:52 CET 2012


On Nov 8, 2012, at 10:14 AM, Brian Hobbs <brhobbs at gmail.com> wrote:

> Hello,
> 
> I am currently trying to find an easy way to take a table with a mix
> of numbers and characters and format the numbers in the table to be
> constrained to 4 significant digits.
> 
> Example:
> 
> #this is my table creation
>> table <- matrix(c(12.34567, "--", 10, 12.34567, "--", "NA", "--", 123.45678,  "--"), ncol = 3, byrow=TRUE)
>> 
>> table
>     [,1]       [,2]        [,3]
> [1,] "12.34567" "--"        "10"
> [2,] "12.34567" "--"        "NA"
> [3,] "--"       "123.45678" "--"
> 
> #I would like for it to be
>     [,1]       [,2]        [,3]
> [1,] "12.35"   "--"        "10"
> [2,] "12.35"   "--"        "NA"
> [3,] "--"       "123.5"     "--"
> 
> I am using the "xtable" package and attempt to use the digits()
> argument within xtable; however, this did not format the numbers,
> likely because my table was forced to character values when I created
> it using matrix(). I am not bothered by the character values in my
> final xtable result; however...
> 
> I have two questions:
> 1) Is there a better way to create my table so that the original
> numeric values are not forced to characters prior to transfer to
> xtable?
> 2) Aside from using signif() or round() on each numeric element within
> my matrix as I create the variable "table", is there a way to get my
> numeric elements to have 4 significant figures prior to be manipulated
> by xtable()?


Some things to note:

1. First, note that 'table' is coerced to a character matrix, since a matrix can only hold one data type. So, even though you included numeric values in the creation, they were coerced to character in the resultant object.

2. I would not be concerned with whether xtable gets a numeric or character based object. You are outputting to LaTeX, which is all going to be character based anyway. I would focus on getting the data into a format that you want and then simply use xtable() to generate the LaTeX markup.

3. Although R is typically smart enough to differentiate between an object named 'table' and the built-in function table(), I would avoid it, because there may be times when you will run into a problem and be scratching your head as to the source of the error.


Vec <- c(12.34567, "--", 10, 12.34567, "--", "NA", "--", 123.45678,  "--")

# Warnings about NA's will occur here
Vec.new <- ifelse(!is.na(as.numeric(Vec)), signif(as.numeric(Vec), 4), Vec)

> Vec.new
[1] "12.35" "--"    "10"    "12.35" "--"    "NA"    "--"    "123.5"
[9] "--"  


> matrix(Vec.new, ncol = 3, byrow = TRUE)
     [,1]    [,2]    [,3]
[1,] "12.35" "--"    "10"
[2,] "12.35" "--"    "NA"
[3,] "--"    "123.5" "--"


Regards,

Marc Schwartz




More information about the R-help mailing list