Skip to content

Formatting digits in a table with mix of numbers and characters

4 messages · Brian Hobbs, David Winsemius, Marc Schwartz +1 more

#
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
[,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()?



Environment: R Studio 0.96.331
R version: 64-bit 2.15.2


Thank you for the help,
Brian Hobbs
Pulmonary and Critical Care Fellow
Harvard Combined Program
#
On Nov 8, 2012, at 8:14 AM, Brian Hobbs wrote:

            
Appears from your desired output that your interpretation of "significant digits differs from that of the format function's implementation. (See below)
I cannot think of any at the moment.
Not sure.
Warning messages:
1: In ifelse(!is.na(as.numeric(table)), format(as.numeric(table), digits = 4),  :
  NAs introduced by coercion
2: In format(as.numeric(table), digits = 4) : NAs introduced by coercion
[,1]     [,2]     [,3]    
[1,] " 12.35" "--"     " 10.00"
[2,] " 12.35" "--"     "NA"    
[3,] "--"     "123.46" "--"
#
On Nov 8, 2012, at 10:14 AM, Brian Hobbs <brhobbs at gmail.com> wrote:

            
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)
[1] "12.35" "--"    "10"    "12.35" "--"    "NA"    "--"    "123.5"
[9] "--"
[,1]    [,2]    [,3]
[1,] "12.35" "--"    "10"
[2,] "12.35" "--"    "NA"
[3,] "--"    "123.5" "--"


Regards,

Marc Schwartz
#
Hi,

You can also use formatC().
table[]<-ifelse(!is.na(as.numeric(tab1)),formatC(as.numeric(table),format="fg",width=4),table)
#warnings will be present 
?table
#???? [,1]??? [,2]??? [,3]? 
#[1,] "12.35" "--"??? "? 10"
#[2,] "12.35" "--"??? "NA"? 
#[3,] "--"??? "123.5" "--"? 
A.K.







----- Original Message -----
From: David Winsemius <dwinsemius at comcast.net>
To: Brian Hobbs <brhobbs at gmail.com>
Cc: r-help at r-project.org
Sent: Thursday, November 8, 2012 12:40 PM
Subject: Re: [R] Formatting digits in a table with mix of numbers and characters
On Nov 8, 2012, at 8:14 AM, Brian Hobbs wrote:

            
Appears from your desired output that your interpretation of "significant digits differs from that of the format function's implementation. (See below)
I cannot think of any at the moment.
Not sure.
Warning messages:
1: In ifelse(!is.na(as.numeric(table)), format(as.numeric(table), digits = 4),? :
? NAs introduced by coercion
2: In format(as.numeric(table), digits = 4) : NAs introduced by coercion
? ?  [,1]? ?  [,2]? ?  [,3]? ? 
[1,] " 12.35" "--"? ?  " 10.00"
[2,] " 12.35" "--"? ?  "NA"? ? 
[3,] "--"? ?  "123.46" "--"? ?