繁体   English   中英

R DT(数据表)中货币、数字和百分比的条件(逐行)格式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM