L oop в столбцах для форматирования столбцов с помощью R-Package форматируемого kableExtra (R dplyr) - PullRequest
0 голосов
/ 23 января 2020

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,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 в oop?

Это необходимо, потому что разные категории, которые я должен исследовать, могут иметь до 18 разных вариантов. В каждом наборе данных V1 всегда является эталонным вариантом.

Как вы видите (запустите код!), Первая строка («N») закодирована в неправильном вопросе. Можно ли сравнивать только со второй строки (по умолчанию для первой строки установлено значение ИСТИНА)

Это было бы хорошо, потому что первая строка теперь отформатирована в том, что на самом деле не делает чувство.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Спасибо, @AllanCameron!

Я не знаком с пакетом purrr - мне действительно нужно больше изучить его.

Ваша идея с purrr::map_dfc решила Проблема.

Вместо первого столбца мне нужна первая строка (di git -row), и, конечно, с 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")

Большое спасибо!

0 голосов
/ 23 января 2020

Чтобы ответить на два ваших вопроса:

  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")

Что дает этот результат: enter image description here

...