[英]Conditional (row-wise) formating of currency, number, and percentage in R DT (datatable)
我的 DT 输出(在 Shiny 中)中有一个列,该列有一个数值,其单位取决于另一列。 有些值是百分比,有些是货币,有些是纯数字。
例如,我想把这个输入...
默认格式 | 价值 |
---|---|
PCT | 12345.67 |
美元 | 12345.67 |
数字 | 12345.67 |
...进入这个 DT 输出:
默认格式 | 价值 |
---|---|
PCT | 123.45% |
美元 | 12,345 美元 |
数字 | 12,345.67 |
formatCurrency()
、 formatPercentage()
和formatRound()
函数可以满足我对每种格式的需要,但它们会影响整个列而不是特定的单元格。 另一方面, formatStyle()
可以基于另一列定位一列中的特定单元格,但我无法找到一种方法让它更改内容而不是样式。
此外,我尝试使用formatStyle()
设置类,希望在 .css 文件中我可以定位,例如.pctclass:after
和.currencyclass:before
但它忽略了类属性。
除了数字、百分比和货币,什么是获取formatStyle()
条件行为的好方法?
编辑:这是从这里的方法借用的解决方案: https ://stackoverflow.com/a/35657820/6851825
您正在寻求根据基础数据而不是其不同的格式化外观对格式化列进行排序。 您可以通过使用未格式化的帮助列来处理排序来做到这一点:
library(dplyr)
data.frame(
stringsAsFactors = FALSE,
DefaultFormat = c("PCT", "DOLLAR", "NUMBER"),
Value = c(54.54, 12345.67, 12345.67)
) %>%
mutate(Value_fmt = case_when(DefaultFormat == "PCT" ~ scales::percent(Value),
DefaultFormat == "DOLLAR" ~ scales::dollar(Value),
DefaultFormat == "NUMBER" ~ scales::comma(Value),
TRUE ~ as.character(Value)) %>%
forcats::fct_reorder(Value), .after = 1) %>%
DT::datatable(rownames = FALSE, options = list(columnDefs = list(
list(orderData = 2, targets = 1),
list(visible=FALSE, targets = 2))))
例如,请注意5 454%
是如何出现在其他条目之前的,即使它按字母顺序排在后面:
(这不是DT
特定的,不清楚这是否是一个要求。)
您可以分组或拆分并分配:
library(dplyr)
set.seed(2)
dat <- data.frame(fmt = sample(c("PCT","DOLLAR","NUMBER"), 10, replace = TRUE), value = round(runif(10, 10, 9999), 2))
dat %>%
group_by(fmt) %>%
mutate(value2 = switch(fmt[1],
PCT=scales::percent(value),
DOLLAR=scales::dollar(value),
NUMBER=scales::percent(value),
as.character(value))
)
# # A tibble: 10 x 3
# # Groups: fmt [3]
# fmt value value2
# <chr> <dbl> <chr>
# 1 PCT 1816. 181 621%
# 2 NUMBER 4058. 405 836%
# 3 DOLLAR 8536. $8,536.10
# 4 DOLLAR 9763. $9,763.24
# 5 PCT 2266. 226 577%
# 6 PCT 4453. 445 320%
# 7 PCT 759. 75 897%
# 8 PCT 6622. 662 171%
# 9 PCT 3881. 388 123%
# 10 DOLLAR 8370. $8,369.69
另一种方法是使用case_when
,它会得出非常相似的结果,但它一次只能处理一个字符串; 此方法每组调用一次格式函数,也许效率更高一些。 (如果有必要,交给你。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.