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

问题描述

我正在尝试通过一个简单的任务熟悉 rmarkdown。但是,我在渲染表格时遇到了一个基本步骤。我希望一些行/列组合以货币格式和一些百分比格式。考虑这个简化的设置和数据框,重点是百分比问题:

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 的其余部分不存在。 (在 stackoverflow 帖子之后,我也尝试使用 list 和 unlist,但出现了同样的错误。)我找不到用于更改行/列位置格式的文档或示例。在 gt 中,格式化任务没问题,但我需要将 rmarkdown 代码编织到 html 以外的其他内容,而 gt 还不能在 pdf 或 Word 中生成漂亮的表格。感谢您的帮助!

解决方法

首先,它使用 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()

输出

table with currency and percent in kable

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...