【问题标题】:Set adaptive col.names in knitr::kable()在 knitr::kable() 中设置自适应 col.names
【发布时间】:2018-08-20 14:23:16
【问题描述】:

请考虑以下事项。我开始使用 R markdown 编写可重现的文档,并希望得到一些报告的输出。由于我正在使用多个data.frame,并且它们的列名不是很丰富或漂亮,我想在knitr::kable() 中使用col.names 参数。


问题:由于data.frame 相当大,我想在整个报告中仅显示特定列,我希望新列名自动显示,具体取决于我选择的列。

我可以像下面的例子那样手动完成:

library(knitr)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

knitr::kable(iris %>% head(),
             col.names = c("Sepal length", "Sepal width", "Petal length",
                           "Petal width", "Species"))

| Sepal length| Sepal width| Petal length| Petal width|Species |
|------------:|-----------:|------------:|-----------:|:-------|
|          5.1|         3.5|          1.4|         0.2|setosa  |
|          4.9|         3.0|          1.4|         0.2|setosa  |
|          4.7|         3.2|          1.3|         0.2|setosa  |
|          4.6|         3.1|          1.5|         0.2|setosa  |
|          5.0|         3.6|          1.4|         0.2|setosa  |
|          5.4|         3.9|          1.7|         0.4|setosa  |

但是当我减少这个data.frame 以仅显示某些列时,我必须再次手动设置col.names(这里删除我不再需要的col.names)才能不收到错误消息:

knitr::kable(iris %>% filter(Species == "setosa") %>% 
           select(Sepal.Length, Sepal.Width, Species) %>% head(),
         col.names = c("Sepal length", "Sepal width", "Species"))

| Sepal length| Sepal width|Species |
|------------:|-----------:|:-------|
|          5.1|         3.5|setosa  |
|          4.9|         3.0|setosa  |
|          4.7|         3.2|setosa  |
|          4.6|         3.1|setosa  |
|          5.0|         3.6|setosa  |
|          5.4|         3.9|setosa  |

问题:有没有办法克服这个问题,例如使用switch 并只指定一次"Sepal.Length" = "Sepal length" 等?这还应该考虑到我通过dplyr::mutate() 创建的任何新列,方法是保持新添加的列名原样,或者在文档的开头指定它,而不会在每次该列不是时都返回错误(仍然)存在。

【问题讨论】:

    标签: r r-markdown kable reproducible-research


    【解决方案1】:

    您可以将列名修改为data.frames并使用列号指定select()中的列

    如:

    library(dplyr)
    colnames(iris) <- c("Sepal length", "Sepal width", "Petal length",
                               "Petal width", "Species")
    
    knitr::kable(iris %>% head() %>% select(1,2,5), format = "markdown")    
    
    | Sepal length| Sepal width|Species |
    |------------:|-----------:|:-------|
    |          5.1|         3.5|setosa  |
    |          4.9|         3.0|setosa  |
    |          4.7|         3.2|setosa  |
    |          4.6|         3.1|setosa  |
    |          5.0|         3.6|setosa  |
    |          5.4|         3.9|setosa  |
    

    reprex package (v0.2.0.9000) 于 2018 年 8 月 21 日创建。

    【讨论】:

    • 是的。但这也会改变整个数据分析的列名(即,如果我不想使用列号,我将不得不使用像“Sepal length”这样的全名)。此外,使用列号而不是列名时,我发现在使用 data.frames 时不太可靠,因为它们的列数会发生变化。
    猜你喜欢
    • 2019-04-08
    • 2021-12-13
    • 2018-04-20
    • 1970-01-01
    • 2018-10-20
    • 2019-06-07
    • 2018-10-14
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多