gt 表中的特殊零值

Special zero value in gt tables

我正在使用 {gt} 包在报告中创建 table。我希望将“$0.00”货币值替换为“-”,这在 Excel 中很容易做到,但在 {gt} 中似乎很难做到。这是一个 table 的示例,我想将零值替换为更容易接受的内容。我能做的最好的事情就是使用 fmt 并制作一个自定义函数来重新创建 fmt_currency 的全部功能,这看起来不太好。

library(gt)
library(magrittr)
data <- data.frame(x=c(1.23,4.56,0,0,0,0,0))
table <- gt(data) %>%
  fmt_currency(x)

我觉得gt::text_transform()可以解决你眼前的问题

library(gt)
library(magrittr)
data <- data.frame(x=c(1.23,4.56,0,0,0,50,1.5))
table <- data %>% 
  gt() %>%
  fmt_currency(x)

table

table %>% 
  text_transform(
    locations = cells_body(
      x,
      rows = x==0
    ),
    fn = function(x){
      "-"
    }
  )

多列

如果您想跨多个列执行此操作,您可能还想将其包装到一个函数中并针对特定列进行调用。

data <- data.frame(
  x = c( 0, -0.230, 0, -0.445, 0),
  y = c( -0.230, 0.0705, 0.460, -0.686, 0),
  z = c( 0, 0, 0.07, 0.129, -0.68)
)

currency_dash <- function(gt_data, col_name) {
  text_transform(
    gt_data,
    locations = cells_body(
      columns = {{ col_name }},
      rows = {{ col_name }} == 0
    ),
    fn = function(x) {
      "-"
    }
  )
}

data %>% 
  gt() %>% 
  fmt_currency(columns = everything()) %>% 
  currency_dash(x) %>% 
  currency_dash(y) %>% 
  currency_dash(z)

一般变换

但是您可能更适合将逻辑放入 text_transform()

data <- data.frame(
  x = c( 0, -0.230, 0, -0.445, 0),
  y = c( -0.230, 0.0705, 0.460, -0.686, 0),
  z = c( 0, 0, 0.07, 0.129, -0.68)
)

table_currency <- data %>% 
  gt() %>% 
  fmt_currency(everything()) 

table_currency %>% 
  text_transform(
    locations = cells_body(),
    fn = function(x) ifelse(x == "[=12=].00", "-", x))
  ) 

对来自@thomas-mock 的答案投了赞成票,因为它是 gt 的内部答案。如果您不局限于在 gt::fmt_currency 内执行所有操作,利用 dplyrscales 可能会很有用,尤其是当您可能想与 dplyr::across 结合使用以替换任何地方时这发生在整个 table.

library(gt)
library(dplyr)

df <- data.frame(
  amt_x = c(1.23,4.56,0,0,0,0,0),
  amt_y = c(12.32,2.26,4.23,0,0,0,0)
)

df %>%
  mutate(
    across(starts_with("amt"), scales::dollar),
    across(starts_with("amt"), ~recode(.x, "[=10=].00" = "-")),
  ) %>%
  gt() %>%
  cols_align(
    align = "right",
    columns = starts_with("amt")
  )

当然,其他的反应都很好。我喜欢使用通用格式化函数 gt::fmt() 来解决这个问题,而不是 gt::fmt_currency().

library(gt)

data <- 
  data.frame(
    x = c( 0, -0.230, 0, -0.445, 0),
    y = c( -0.230, 0.0705, 0.460, -0.686, 0),
    z = c( 0, 0, 0.07, 0.129, -0.68)
  )

table <- 
  data %>% 
  gt() %>%
  fmt(
    columns = everything(),
    fns = function(x) ifelse(x == 0, "—", scales::dollar(x, accuracy = 0.01))
  )

reprex package (v2.0.1)

于 2021-08-24 创建