【问题标题】:Loop through columnames to format colums with R-Package formattable kableExtra (R dplyr)循环列名以使用 R-Package formattable kableExtra (R dplyr) 格式化列
【发布时间】:2020-01-23 12:51:30
【问题描述】:

嘿,

为了比较几种不同的数据,我制作了一份 HTML 报告。 给定一个特殊的类别,数据库中的一些索引应该是相同的。为了检测数据库中的错误/不正确的条目,我比较了表中的不同类别。 为了更好地阅读,最好有彩色表格。这可以通过formattable-Package 轻松完成。

我的数据集:

require(tidyverse)
require(formattable)
require(kableExtra)
require(knitr)
df1 <- data.frame(V1 = c(68,sample(c("J","N"),size=15,replace = TRUE)),
                  V2 = c(10,sample(c("J","N"),size=15,replace = TRUE)),
                  V3 = c(1,sample(c("J","N"),size=15,replace = TRUE))
                 )

它有 - 在这个例子中 - 3 个不同的变体。只推荐一个。假设具有最高 N 的变体(=每个 Vx 列中的第一个条目)是真实的。

我的格式化表格是用这个代码生成的:

df1 %>% 
  mutate(
    V2 = ifelse((as.character(V2) == as.character(V1)) == FALSE,
                cell_spec(V2, color = "red",bold = TRUE), 
                cell_spec(V2, color = "black",bold = FALSE)),
    V3 = ifelse((as.character(V3) == as.character(V1)) == FALSE,
                cell_spec(V3, color = "red",bold = TRUE), 
                cell_spec(V3, color = "black",bold = FALSE))
  ) %>%
  kable(format = "html", escape = FALSE) %>%
  kable_styling(c("striped", "condensed"), full_width = FALSE) %>%
  row_spec(1, bold = T, color = "white", background = "#D7261E")

两个问题:

  1. 如何循环mutate

这是必要的,因为我必须调查的不同类别最多可以有 18 个不同的变体。在每个数据集中,V1 每次都是参考变体。

  1. 如您所见(运行代码!)第一行(“N”)编码错误。是否可以仅从第二行开始比较(第一行默认设置为 TRUE)

这样就好了,因为第一行现在的格式并不真正有意义。

谢谢!

【问题讨论】:

    标签: r dplyr kableextra formattable


    【解决方案1】:

    回答你的两个问题:

    1. 您可以使用mutate_all,而不是循环遍历列
    2. 只需复制第一列,然后mutate 稍后再返回

    我首先将您的 cell_spec 调用转换为函数以减少代码中的混乱。

      red   <- function(x) cell_spec(x, color = "red", bold = TRUE)
      black <- function(x) cell_spec(x, color = "black", bold = FALSE)
      c1    <- as.character(df1[[1]])
    

    现在我们可以这样做了:

      df1                                                                           %>% 
      select(-V1)                                                                   %>%
      mutate_all(function(x) ifelse(as.character(x) != df1[[1]], red(x), black(x))) %>%
      mutate(V1 = black(c1))                                                        %>%
      mutate_all(function(x) `[<-`(x, 1, " "))                                      %>%
      select(V1, V2, V3)                                                            %>%
      kable(format = "html", escape = FALSE)                                        %>%
      kable_styling(c("striped", "condensed"), full_width = FALSE)                  %>%
      row_spec(1, bold = T, color = "white", background = "#D7261E")
    

    这给出了这个结果:

    【讨论】:

    • 关于第一列 - 第一行的意思是:-)
    • @VolkerHolzendorf 好的,试试修改后的版本
    • @VolkerHolzendorf 实际上,您可以使用mutate_all 而无需加载purrr。答案已更新。它回答了你的问题吗?
    • 我想我解决了我的问题 - 你对 purrr::map_dfc 的提示是我需要的。谢谢!
    • @VolkerHolzendorf 如果我的回答对您有所帮助,请考虑接受它,以便其他有类似问题的人可以找到解决方案。谢谢。
    【解决方案2】:

    谢谢你,@AllanCameron!

    我对 purrr 包不熟悉 - 我真的应该对它做更多的研究。

    您对purrr::map_dfc 的想法解决了这个问题。

    我需要第一行(数字行)而不是第一列,当然使用grepl 可以解决这个问题。 ifelse-Statement 中的条件则稍长一些。

    我的最终解决方案是:

    df1 %>% 
      map_dfc(function(x) ifelse(as.character(x) != as.character(df1$V1) & !grepl("[[:digit:]]",x), 
                                 mark_true(x), mark_false(x))) %>%
      select(V1, everything()) %>%
      kable(format = "html", escape = FALSE) %>%
      kable_styling(c("striped", "condensed"), full_width = FALSE) %>%
      row_spec(1, bold = T, color = "white", background = "#D7261E")
    

    非常感谢!

    【讨论】:

      猜你喜欢
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2021-08-07
      • 2020-08-21
      相关资源
      最近更新 更多