Форматирование таблицы уценки с числовыми и целочисленными столбцами

Как с помощью функции knitr::kable() можно игнорировать форматирование целочисленного столбца и форматировать все остальные числовые столбцы?

Пример:

knitr::kable(x = as.data.frame(rbind(c(1L, 21.211), c(2L, 31.233))), format.args = list("digits" = 2, "nsmall" = 2, "big.mark" = ".", "decimal.mark" = ",", "scientific" = FALSE))

Он возвращает:

[1] "| V1| V2|" "|----:|-----:|" "| 1,00| 21,21|" "| 2,00| 31,23|"

И у меня такой вывод:

[1] "| V1| V2|" "|----:|-----:|" "| 1| 21,21|" "| 2| 31,23|"

Спасибо


person Anders Bæk    schedule 22.08.2017    source источник
comment
вы видели это stackoverflow.com/questions/30949768/   -  person J_F    schedule 22.08.2017
comment
Спасибо за ваш ответ. Но я ищу более автоматизированный подход. Возможно, можно написать некоторую логику, которая может справиться с этим, основываясь на упомянутом сообщении.   -  person Anders Bæk    schedule 22.08.2017


Ответы (1)


knitr::kable всегда применяет один и тот же формат ко всем числовым столбцам, поэтому ваш единственный выбор - выполнить преобразование в символьные столбцы перед его вызовом, как предлагается в справочнике J_F.

Сомневаюсь, что это можно было бы полностью автоматизировать. Фрейм данных, с которого вы начинаете, имеет только numeric столбца; значения integer преобразуются в numeric на c(). (Вы могли бы избежать этого, построив фрейм данных по-другому.) Предполагая, что у вас есть способ построить вектор, указывающий, какие столбцы вы хотите отформатировать, вы можете сделать это автоматически примерно так:

df <- as.data.frame(rbind(c(1L, 21.211), c(2L, 31.233)))
intcolumn <- c(TRUE, FALSE)  # This is hard to automate

for (i in seq_len(ncol(df))) {
  if (intcolumn[i])
    df[[i]] <- format(df[[i]])
  else
    df[[i]] <- format(df[[i]], digits = 2, nsmall = 2, big.mark = ".", 
                      decimal.mark = ",", scientific = FALSE)
}
knitr::kable(df, align = "r") # right align as for numeric column

Это производит

| V1|    V2|
|--:|-----:|
|  1| 21,21|
|  2| 31,23|
person user2554330    schedule 22.08.2017