knitr的kable打印2.29e-30为“0”

时间:2017-08-04 19:15:59

标签: r knitr

CODE:

# some data
dat <-
  data.frame(
    log2fc = c(0.28, 10.82, 8.54, 5.64, 8.79, 6.46),
    pvalue = c(0.00e+00, 2.29e-30, 7.02e-30, 4.14e-29, 1.86e-28, 1.78e-27)
  )

# observe in markdown format
knitr::kable(dat, format="markdown")

输出:

| log2fc| pvalue|
|------:|------:|
|   0.28|      0|
|  10.82|      0|
|   8.54|      0|
|   5.64|      0|
|   8.79|      0|
|   6.46|      0|

问题:

输出问题是,它将最后一列pvalue渲染为零。但我希望保留与我在数据帧中看到的格式相同的格式。我怎么做 ?我尝试了各种线程的几种解决方案,但似乎没有任何效果。有人能指出我正确的方向吗?

请不要建议我将pvalue列转换为字符向量。这是一个快速而肮脏的解决方案,但我不想这样做,因为:

  1. 我不想搞乱我的数据框架。
  2. 我感兴趣的是为什么在标记时打印最后一栏的科学格式时没有保留。
  3. 我有很多表,每个表都有各种科学格式的列,我正在寻找一种自动处理这个问题的方法。

1 个答案:

答案 0 :(得分:5)

kable()调用基本R函数round(),除非将数字设置为非常大的值,否则会将这些小值截断为零。但你可以这样做,例如。

knitr::kable(dat, format = "markdown", digits = 32)

给出了

| log2fc|   pvalue|
|------:|--------:|
|   0.28| 0.00e+00|
|  10.82| 2.29e-30|
|   8.54| 7.02e-30|
|   5.64| 4.14e-29|
|   8.79| 1.86e-28|
|   6.46| 1.78e-27|

如果您确实希望在某些列中进行常规舍入,则可以为数字指定多个值,例如

knitr::kable(dat, format = "markdown", digits = c(1, 32))


| log2fc|   pvalue|
|------:|--------:|
|    0.3| 0.00e+00|
|   10.8| 2.29e-30|
|    8.5| 7.02e-30|
|    5.6| 4.14e-29|
|    8.8| 1.86e-28|
|    6.5| 1.78e-27|