使用 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 条件下,.
指的是起始数值(在 q1
或 q2
列中)。
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()
输出
我正在尝试通过一个简单的任务来熟悉 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 条件下,.
指的是起始数值(在 q1
或 q2
列中)。
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()
输出