我有一个包含一行多列的数据框,我想用Rmarkdown中的kable函数(PDF输出)来呈现它。为了更好地呈现它,我使用了“转置”功能并生成了一个新的数据帧。问题是当我使用:big.mark =“,”时,它在转置数据帧上不起作用,尽管在我使用原始数据帧时它可以工作。 我在这里通过编写用来演示该问题的代码为该问题添加示例:
```{r warning = FALSE, error = FALSE, message=FALSE, echo = FALSE, results =
'hide'}
library(kableExtra)
library(tidyverse)
```
```{r warning = FALSE, error = FALSE, message=FALSE, echo = FALSE}
df <- data.frame(x=1000, y=scales::percent(0.34), z=500000)
kable(df, format = "latex", caption = "big.mark problem", booktabs=TRUE,
format.args = list(big.mark = ","))
```
```{r warning = FALSE, error = FALSE, message=FALSE, echo = FALSE}
df_transpose <- t(data.frame(x=1000, y=scales::percent(0.34), z=500000))
kable(df_transpose, format = "latex", caption = "big.mark problem",
booktabs=TRUE, format.args = list(big.mark = ","))
```
```{r warning = FALSE, error = FALSE, message=FALSE, echo = FALSE}
df_transpose_df <- as.data.frame(t(data.frame(x=1000,
y=scales::percent(0.34), z=500000)))
kable(df_transpose_df, format = "latex", caption = "big.mark problem",
booktabs=TRUE, format.args = list(big.mark = ","))
```
```{r warning = FALSE, error = FALSE, message=FALSE, echo = FALSE}
df_transpose_tibble <- as.tibble(t(data.frame(x=1000,
y=scales::percent(0.34), z=500000)))
kable(df_transpose_tibble, format = "latex", caption = "big.mark problem",
booktabs=TRUE, format.args = list(big.mark = ","))
```
第一个表显示的第一个数字为:1,000。 其他表格将其显示为:1000。 我希望所有内容都看起来像第一个。
谢谢!
答案 0 :(得分:2)
您在这里遇到数据类型问题。暂时忘掉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
函数{ {1}}调用-在字符串上,而只能在数字上操作。
相反,您可以从所有数字数值开始(或设置kable
),为每列设置所需的格式设置,然后使用旨在与数据帧一起使用的重塑功能。一种常见的选择是stringsAsFactors = FALSE
,它将为您提供所需形状较长的数据,但将其保留为数据帧/小标题。
tidyr::gather
由reprex package(v0.2.1)于2018-10-29创建