flextable: scientific formats for a table that has both very large and very small numbers

Viewed 60

I want to display the large numbers in scientific format and keep the regular format for the small numbers to reduce column width. The real data have more columns than what is shown here.

dput(A)
structure(list(st2_1 = c(1437.21, 1019.03, 1199.3, 850.35, 67.32, 
586.62), st1_2 = c(0.12, 0.08, 855.64, 606.68, 687.06, 5987.41
), st2_2 = c(0.11, 0.08, 837.72, 593.98, 3659.78, 31893.5), `1-sum(e)` = c(1522.79, 
1075.11, 2092.52, 1513.48, 1052.3, 9066.99), sss_1 = c(0.05, 
0.03, 0.99, 0.7, 0.03, 0.29), sss_2 = c(0.02, 0.02, 0.43, 0.3, 
0.02, 0.19), f_1 = c(4099185668.8, 2766736655.89, 2093885714.17, 
1228712929.01, 5592860407.22, 560845021.29), f_2 = c(990125323.33, 
668282982.85, 14238156533.71, 8355091636.51, 10241029160.69, 
1026957549.35), f_3 = c(237420871.69, 160246712.8, 711346410.36, 
417425137.15, 6553794288.93, 657206264.75)), row.names = c(NA, 
6L), class = "data.frame")

The code below, provided at Flextable format column to scientific notation, doesn't work for me.

A %>%
flextable::flextable() %>%
     set_formatter(numbers = function(x) {
         formatC(x, format = "e", digits = 2)
     }) 
2 Answers

The issue is that there is no column called numbers in your data. According to the docs (?set_formatter) you could pass

Name-value pairs of functions, names should be existing col_key values

to specify the format for columns by name. Hence, to format your large numbers you could do:

library(flextable)

format_scientific <- function(x) {
  formatC(x, format = "e", digits = 2)
}

A |> 
  flextable() |> 
  set_formatter(
    f_1 = format_scientific,
    f_2 = format_scientific,
    f_3 = format_scientific
  )

enter image description here

Here is another option: Using format() function with scientific and digits argument:

library(flextable)
library(dplyr)

A %>% 
  mutate(across(everything(), ~
                  case_when(. < 10000 ~ format(., scientific = FALSE),
                            . >= 10000 ~ format(., scientific = TRUE, digits = 2)))) %>% 
  flextable()

enter image description here

Related