在将 as_grouped_data 与 flextable 一起使用时是否可以有条件地格式化行?
Is it possible to conditionally format rows while using as_grouped_data with flextable?
我试图在调用 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()
当我的数据每天都在变化时,我真的很想不必在 table 的 table 中指定单独的行号。
我们可以创建一个索引列或用另一个名称复制相同的列'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()
-输出
我试图在调用 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()
当我的数据每天都在变化时,我真的很想不必在 table 的 table 中指定单独的行号。
我们可以创建一个索引列或用另一个名称复制相同的列'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()
-输出