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
内执行所有操作,利用 dplyr
和 scales
可能会很有用,尤其是当您可能想与 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 创建
我正在使用 {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
内执行所有操作,利用 dplyr
和 scales
可能会很有用,尤其是当您可能想与 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))
)