使用 kable 和 kableExtra 格式化单元格子集

formatting a subset of cells with kable and kableExtra

我正在尝试通过一个简单的任务来熟悉 rmarkdown。但是,我停留在渲染 table 的基本步骤上。我希望一些 row/column 组合以货币格式设置,一些以百分比格式设置。考虑这个简化的设置和数据框,重点关注百分比问题:

library(tidyverse)
library(kableExtra)
#> 
#> Attaching package: 'kableExtra'
#> The following object is masked from 'package:dplyr':
#> 
#>     group_rows
library(formattable)

year <- c('2014', '2015' , 'pctDiff')
q1 <- c(35288 , 36032 , 0.0211)
q2 <- c(30273 , 29669 , -.0172)
df <- data.frame(year, q1 , q2)
df
#>      year         q1         q2
#> 1    2014 35288.0000 30273.0000
#> 2    2015 36032.0000 29669.0000
#> 3 pctDiff     0.0211    -0.0172

df %>% percent(.[3 , c(2:3)] , 0)
#> Error in as_numeric(x): 'list' object cannot be coerced to type 'double'
percent(df[3 , c(2:3)])
#> [1] 2.11%  -1.72%

我希望格式化命令在管道中工作,但我的尝试产生了错误。第二次尝试产生了我想要的格式但不实用,因为 df 的其余部分不存在。 (在 Whosebug post 之后,我也尝试使用 list 和 unlist,但遇到了同样的错误。)我在 row/col 位置找不到更改格式的文档或示例。在 gt 中,格式化任务没有问题,但我需要将 rmarkdown 代码编织成 html 以外的代码,并且 gt 还不能在 pdf 或 Word 中生成漂亮的 tables。感谢您的帮助!

首先,这使用 mutate_at 仅更改以“q”开头的列。

澄清ifelse:如果行的行号是n(),那么它一定是在计算最后一行,因为n()应该包含的数值总行数(在本例中为 3)。

如果您希望混合列并包含“%”或“$”,则列必须是字符。

如果是第三行,则为TRUE条件,设置as.character(percent(.))。这会将值转换为百分比,并使其成为字符值。

如果不是第三行(即第1行或第2行),则为FALSE条件,设置为as.character(currency(.))。同样,它将值转换为货币,然后确保它是一个字符值。

在 TRUE 和 FALSE 条件下,. 指的是起始数值(在 q1q2 列中)。

library(tidyverse)
library(kableExtra)
library(formattable)

df %>%
  mutate_at(vars(starts_with("q")), funs(
    ifelse(row_number() == n(), 
           as.character(percent(.)), 
           as.character(currency(.))))) %>%
  kbl() %>%
  kable_styling()

输出