У вас есть проблемы с типами данных здесь. Забыв на минуту о kable
материалах, изучите класс и структуру каждого созданного вами объекта.
Прежде всего, это тот факт, что scales::percent
форматирует число и возвращает строку.
library(dplyr)
library(tidyr)
scales::percent(0.34)
#> [1] "34.0%"
class(scales::percent(0.34))
#> [1] "character"
Поскольку data.frame
имеет значение по умолчанию stringsAsFactors = TRUE
, та строка, которую вы создали для y
, теперь является фактором - возможно, это не проблема, но, вероятно, неудобно и не то, что вы могли ожидать.
df <- data.frame(x=1000, y=scales::percent(0.34), z=500000)
df
#> x y z
#> 1 1000 34.0% 5e+05
class(df)
#> [1] "data.frame"
str(df)
#> 'data.frame': 1 obs. of 3 variables:
#> $ x: num 1000
#> $ y: Factor w/ 1 level "34.0%": 1
#> $ z: num 5e+05
Посмотрите документы для t
: возвращает матрицу. Матрицы имеют только один тип данных, поэтому все приводится к строкам.
df_transpose <- t(data.frame(x=1000, y=scales::percent(0.34), z=500000))
class(df_transpose)
#> [1] "matrix"
str(df_transpose)
#> chr [1:3, 1] "1000" "34.0%" "5e+05"
#> - attr(*, "dimnames")=List of 2
#> ..$ : chr [1:3] "x" "y" "z"
#> ..$ : NULL
Когда вы снова преобразовали это в фрейм данных, вы снова получили коэффициенты, а не числовые значения.
df_transpose_df <- as.data.frame(t(data.frame(x=1000, y=scales::percent(0.34), z=500000)))
class(df_transpose_df)
#> [1] "data.frame"
str(df_transpose_df)
#> 'data.frame': 3 obs. of 1 variable:
#> $ V1: Factor w/ 3 levels "1000","34.0%",..: 1 2 3
#> ..- attr(*, "names")= chr "x" "y" "z"
as_tibble
не приводит к факторам, поэтому отличие от предыдущего df состоит в том, что у вас есть все строки вместо факторов.
df_transpose_tibble <- as_tibble(t(data.frame(x=1000, y=scales::percent(0.34), z=500000)))
class(df_transpose_tibble)
#> [1] "tbl_df" "tbl" "data.frame"
str(df_transpose_tibble)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 3 obs. of 1 variable:
#> $ V1: chr "1000" "34.0%" "5e+05"
Основная проблема с каждым из них заключается в том, что после этих преобразований вы затем вызываете функции форматирования - предоставляя аргумент big.mark
для kable
или непосредственно используя вызовы format
function kable
- для строк тогда как они работают только с числами.
Вместо этого вы можете начать со всего числового (или установить stringsAsFactors = FALSE
), установить форматирование так, как вам нужно для каждого из этих столбцов, а затем использовать функцию изменения формы, предназначенную для работы с фреймами данных. Одним из распространенных вариантов является tidyr::gather
, который предоставит вам данные более длинной формы, которые вы искали, но сохранит их в виде фрейма данных / таблицы.
all_numeric <- data.frame(x = 1000, y = 0.34, z = 500000)
all_numeric %>%
mutate(x = formatC(x, big.mark = ","),
y = scales::percent(y)) %>%
gather(key, value)
#> key value
#> 1 x 1,000
#> 2 y 34.0%
#> 3 z 5e+05
Создано в 2018-10-29 пакетом Представить (v0.2.1)