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

使用kable和kableExtra格式化单元格子集,r,r-markdown,kable,kableextra,formattable,R,R Markdown,Kable,Kableextra,Formattable,我试图通过一个简单的任务来熟悉rmarkdown。然而,我仍然停留在渲染表的基本步骤上。我希望一些行/列组合的格式是货币,一些是百分比。考虑这个简化的设置和数据框,重点是百分比问题: 库(tidyverse) 图书馆(kableExtra) #> #>附加包装:“kableExtra” #>以下对象已从“package:dplyr”屏蔽: #> #>分组行 库(格式化表) 第3年pctDiff 0.0211-0.0172 df%>%百分比([3,c(2:3)],0) #>as_numeric

我试图通过一个简单的任务来熟悉rmarkdown。然而,我仍然停留在渲染表的基本步骤上。我希望一些行/列组合的格式是货币,一些是百分比。考虑这个简化的设置和数据框,重点是百分比问题:

库(tidyverse)
图书馆(kableExtra)
#> 
#>附加包装:“kableExtra”
#>以下对象已从“package:dplyr”屏蔽:
#> 
#>分组行
库(格式化表)
第3年pctDiff 0.0211-0.0172
df%>%百分比([3,c(2:3)],0)
#>as_numeric(x)中出错:“列表”对象不能强制为“双精度”类型
百分比(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)

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

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

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

在TRUE和FALSE两种情况下,
都指起始数值(在
q1
q2
列中)

输出


那这个软件包是怎样的呢
scales
?我在发布这个之前确实试过scales。我找不到一个可行的方法。谢谢你的代码和解释。我还需要加载formattable以使代码在这里工作。那么,您将在何处添加第二条ifelse语句来处理货币位置(第1行和第2行,cols q1和q2)?我试过了,但没有成功。我不理解ifelse在这种情况下是如何工作的,因为它似乎没有对测试选项说“不”。我只是对formattable在没有将目标单元格更改为字符(如果它不在管道中)的情况下工作的原因感到困惑。对不起,我显然不是这方面的专家。对不起,有什么困惑。我添加了
库(formattable)
。我还为非最后一行的行包括了货币,如
q1
q2
。我更新了解释,希望能澄清一些事情。它有“是”(TRUE)和“否”(FALSE)条件,它们只是在不同的代码行上。对于最后一条语句,
formattable
可以很好地处理列的单个类型(百分比或货币)。然后,列可以是
formattable
numeric
,并具有描述格式的属性(包括位数等)。但是,在同一列中合并百分比和货币将涉及不同的
formattable
属性,这是一个问题。感谢Ben添加的代码和说明。这对我来说更有意义。
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()