[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