【问题标题】:Is it possible to conditionally format rows while using as_grouped_data with flextable?是否可以在将 as_grouped_data 与 flextable 一起使用时有条件地格式化行?
【发布时间】:2021-12-22 10:47:04
【问题描述】:

在调用 as_grouped_data 后,我正在尝试根据分组行的条件有条件地格式化行:

library(tidyverse)
library(flextable)

df <- tibble(vStat = c(rep("Average Degree", 3), rep("Average Weight", 3)),
             val = c(1.22222, 1.33333, 1.44444, 1.55555, 1.66666, 1.77777))

flextable(df %>%
            as_grouped_data(groups="vStat")) %>%
  colformat_double(i = ~ vStat=="Average Degree", digits=1) %>% # not working
  colformat_double(i = ~ vStat=="Average Weight", digits=3) %>% # not working
  autofit()

我了解上述内容不起作用,因为colformat_double 中的条件仅适用于val 现在为 NA 的行:

df %>%
  as_grouped_data(groups="vStat")

>            vStat     val
> 1 Average Degree      NA
> 3           <NA> 1.22222
> 4           <NA> 1.33333
> 5           <NA> 1.44444
> 2 Average Weight      NA
> 6           <NA> 1.55555
> 7           <NA> 1.66666
> 8           <NA> 1.77777

调用first 时,它似乎不像分组数据那样正常工作:

flextable(df %>%
            as_grouped_data(groups="vStat")) %>%
  colformat_double(i = ~ first(vStat=="Average Degree"), digits=1) %>%
  colformat_double(i = ~ first(vStat=="Average Weight"), digits=3) %>%
  autofit()

> Error in get_rows_id(x[[part]], i) : invalid row selection: length(i) [1] != nrow(dataset) [8]

分组前在数据集中四舍五入也没有得到我想要的,位数仍然达到最高条件并用零填充:

flextable(df %>%
            mutate(val = case_when(vStat=="Average Degree" ~ round(val, 1),
                                   vStat=="Average Weight" ~ round(val, 3))) %>%
            as_grouped_data(groups="vStat")) %>%
  autofit()

当我的数据每天都在变化时,我真的不想在一个有 50 行的表中指定 colformat_double 中的单个行号。

【问题讨论】:

    标签: r flextable


    【解决方案1】:

    我们可以创建一个索引列或使用另一个名称复制同一列“vStat”并对索引执行条件或在另一列上使用相同的代码并稍后将其删除

    library(dplyr)
    library(flextable)
    flextable(df %>%
                mutate(ind = match(vStat, unique(vStat))) %>%
                as_grouped_data(groups="vStat")) %>%
      colformat_double(i = ~ ind == 1, digits=1) %>% # not working
      colformat_double(i = ~ ind == 2, digits=3) %>% # not working
       void(j = ~ind) %>%
      compose( j = 3, value = as_paragraph(""), part = "header") %>%
    
      autofit()
    

    -输出

    【讨论】:

    • 谢谢@akrun!我不知道void。将第一个 mutate 替换为 mutate(ind = vStat) 并将 compose 行替换为 void(j = ~ind, part="header") 会简化一些事情。
    • col_keys 可用于仅显示某些列并获得更短的代码(其他仍可用于公式):flextable(..., col_keys = c("vStat", "val")) %&gt;% colformat_double(i = ~ ind == 1, digits=1) %&gt;% colformat_double(i = ~ ind == 2, digits=3) %&gt;% autofit()
    猜你喜欢
    • 2011-11-23
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2010-12-26
    相关资源
    最近更新 更多