big.mark =“,”在转置数据帧时不适用于Rmarkdown中的kable函数

时间:2018-10-29 16:52:22

标签: r latex knitr transpose kable

我有一个包含一行多列的数据框,我想用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。 我希望所有内容都看起来像第一个。

谢谢!

1 个答案:

答案 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创建