Форматировать таблицу числовых данных по строкам в R, используя tidyverse для вывода kable - PullRequest
0 голосов
/ 25 июня 2018

У меня есть таблица значений, которую я хочу сохранить в виде таблицы kable().Каждая строка таблицы является переменной, а каждый столбец является значением этой переменной (например, среднее значение, минимум, максимум и т. Д.).Вы можете применить функцию format() к столбцам фрейма данных, но применять ее к строкам кажется очень неудобным.Я наконец достиг своей цели с помощью этого кода, но мне было бы интересно, если бы был tidier способ сделать это!

library(tidyverse)
library(broom)
library(kableExtra)

# test data
all <- tibble(PARAMETER=c("A","B", "C"), 
              Value1=c(0.0123, 1230, NA), 
              Value2=c(0.0234, 2340, 1.23), 
              Units=c("m", "Pa", "ha"), 
              Description=c("Length", "Pressure", "Area"))

# my formatting function
my_format <- function(x){
  y <- format(x, digits=3, scientific=FALSE, TRIM=TRUE)
  y[is.na(x)] <- ""
  y
}

# format values by row
all_formatted <- all %>%
  `row.names<-`(.$PARAMETER) %>% # set row names for transpose
  select(-PARAMETER, -Units, -Description) %>% # only numeric columns
  t() %>% # transpose
  tidy() %>% # convert to tibble (creates .rownames column)
  modify(my_format) %>% # apply format function to each column of values in place
  `row.names<-`(.$.rownames) %>% # set row names for transpose
  select(-.rownames) %>% # drop rownames column
  t() %>% # transpose
  tidy() %>% # convert to tibble (creates .rownames column)
  select(-.rownames) %>% # drop rownames
  add_column(PARAMETER=all$PARAMETER, .before=1) %>% # add back nonnumeric columns
  add_column(UNITS=all$Units, 
             DESCRIPTION=all$Description)

# print formatted table
all_formatted %>%
  kable() %>%
  kable_styling(
    bootstrap_options = c("condensed", "striped", "hover"),
    full_width=FALSE, position="left", font_size=12) %>%
  save_kable(file="temp.html", self_contained=TRUE) # very slow

enter image description here

1 Ответ

0 голосов
/ 25 июня 2018

Не знаю, насколько вы привязаны к kable, но flextable - одна из моих любимых вещей, и обычно она обрабатывает HTML и .doc одинаково. Хитрость заключается в том, чтобы сделать это по столбцу, а не по строке ... просто укажите характеристики чисел, которые вы хотите отформатировать по-разному:

library(flextable)
all %>% regulartable() %>% align(align="center",part="all") %>% 
    set_formatter(Value1 = function(x) 
                     ifelse(x > 1, sprintf("%.0f", x), sprintf("%.03f", x) ),
                  Value2 = function(x) 
                     ifelse(x > 1, sprintf("%.0f", x), sprintf("%.03f", x) ))

enter image description here

Надеюсь, это поможет:)

...