【问题标题】:Conditional formatting of entire table in FlexTableFlexTable 中整个表格的条件格式
【发布时间】:2018-11-05 13:16:45
【问题描述】:

我想要做的是有条件地根据一个值在 r 中格式化整个表格,我目前正在尝试使用 flextable:

#some data 
SalesData<-data.frame(Appliance=c("Radio", "Laptop", "TV", "Fridge"), ThisYear=c(5,25,5,8), LastYear=c(6,20,5,8))

#use flextable to conditionally format the data so that anything in the ThisYear column more than 10 is light blue
library(flextable)

SalesData<-regulartable(SalesData)
SalesData<-bg(SalesData, i = ~ ThisYear >10,j= ~ ThisYear,bg = "light blue")
SalesData

我拥有的表格可能非常大,那么如何将其应用于整个表格而不必为每个单独的列指定格式?

【问题讨论】:

    标签: r flextable


    【解决方案1】:

    请同时检查bg函数的examples

    flextable V0.6.5 开始,使用颜色映射可以很容易地实现条件格式,例如scales::col_*functions.

    这是上一个示例的另一种可能的解决方案:

    library(flextable)
    
    # Some data 
    SalesData <- data.frame(Appliance = c("Radio", "Laptop", "TV", "Fridge"), 
                            ThisYear = c(5, 11, 5, 12), 
                            LastYear = c(19, 20, 5, 8))
    
    # List of columns to loop through
    columns <- c("ThisYear","LastYear")
    
    # Define colors and ranges
    bg_picker <- scales::col_bin(
        palette = c("white", "light blue"),
        domain = c(0, 100), # min and max range can be also set dynamically 
        bins = c(0, 10, 20)) # as well as the bins
    
    
    ftab <- regulartable(SalesData) %>% 
        bg(j = columns, bg = bg_picker)
    
    # Show the table
    ftab
    

    【讨论】:

    • 我发现这是线程上最好、最有用的答案。 scales::col_* 函数比下面公认的解决方案更容易,并且具有因子和其他数据类型的实现。
    【解决方案2】:

    为此,您既可以不使用j,也可以将其值设置为列名:

    SalesData<-data.frame(Appliance=c("Radio", "Laptop", "TV", "Fridge"), ThisYear=c(5,25,5,8), LastYear=c(6,20,5,8))
    
    # option 1
    ft1 <-regulartable(SalesData)
    ft1 <-bg(ft1, i = ~ ThisYear >10, bg = "light blue")
    ft1
    
    # option 2 (recommanded)
    ft2 <-regulartable(SalesData)
    ft2 <- bg(ft, i = ~ ThisYear >10, j = names(SalesData), bg = "light blue")
    ft2
    

    【讨论】:

    • 为了澄清我的问题,我想要的效果是应用 >10 的格式,为表格中的每个单元格提供一个浅蓝色单元格。因此,在此示例中手动执行此操作是将 SalesData10,j= ~ LastYear,bg = "light blue") 添加到代码中
    • (所以如果我理解的话,这不适用于Appliance...)然后您需要遍历要着色的列...
    【解决方案3】:

    我想我会在这里发布最终代码,因为它可能会对某人有所帮助: 代码围绕“columns”向量中指定的列循环,并根据其值对它们进行着色。

    #some data 
    SalesData<-data.frame(Appliance=c("Radio", "Laptop", "TV", "Fridge"), ThisYear=c(5,11,5,12), LastYear=c(19,20,5,8))
    
    library(flextable)
    SalesData<-regulartable(SalesData)
    
    #list of columns to loop through
    columns<-c("ThisYear","LastYear")
    
    #loop to colorise the columns
    for (i in seq_along(columns)){
    #anything with a value of more than 10 is formatted light blue
    eval(parse(text= paste0("SalesData<-", "bg (SalesData,i=~", columns[i], ">10, j=~", columns[i], " ,bg=\"light blue\")")))
    }
    #show the table
    SalesData
    

    【讨论】:

    • 如果我比较字符值,我该如何修改它,例如而不是像 10 这样的静态值,我将每个单元格值逐列与 ref 列单元格值进行比较。
    • 将静态编号更改为您的参考列的名称。例如: eval(parse(text= paste0("SalesDataReferenceCol, j=~", columns[i], " ,bg= \"浅蓝色\")")))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多