通过columnames循环以使用R-Package formattable kableExtra(R dplyr)格式化列

Hei

为了比较几种数据变体,我制作了一个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,V3 = c(1,replace = TRUE))
                 )

在此示例中,它具有3个不同的变体。仅推荐一个。假定具有最高N(=每个Vx列中的第一个条目)的变量是真实变量。

我的格式化表格是用以下代码生成的:

df1 %>% 
  mutate(
    V2 = ifelse((as.character(V2) == as.character(V1)) == FALSE,cell_spec(V2,color = "red",bold = TRUE),color = "black",bold = FALSE)),V3 = ifelse((as.character(V3) == as.character(V1)) == FALSE,cell_spec(V3,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)

这很好,因为第一行的格式现在已经没有意义了。

谢谢!

tgy126 回答:通过columnames循环以使用R-Package formattable kableExtra(R dplyr)格式化列

要回答您的两个问题:

  1. 您可以使用mutate_all
  2. 而不是遍历各列
  3. 只需复制第一列,然后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")

给出以下结果: enter image description here

,

谢谢@AllanCameron!

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

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

我需要第一行(数字行)来代替第一列,当然可以使用grepl来解决此问题。 ifelse声明中的条件要长一些。

然后我的最终解决方案是:

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",full_width = FALSE) %>%
  row_spec(1,background = "#D7261E")

非常感谢您!

本文链接:https://www.f2er.com/2725025.html

大家都在问