【问题标题】:pander number of digits after decimal point小数点后的位数
【发布时间】:2016-08-15 03:14:42
【问题描述】:

我正在尝试在 .rmd 文件中使用 pander 将表格输出为 pdf,小数点后有 2 位数字,但使用以下 rmd 没有数字:

---
title: "Long table test"
output: pdf_document
---

Here is a table:

```{r setup}
library (data.table)
library (pander)

set.seed(1984)
longString <- "description string"
dt <- data.table(id=c(1:3),description=rep(longString,3),value=rnorm(3,mean=10000,sd=1))
```

```{r pander-table}
panderOptions('round',2)
panderOptions('digits',2)
panderOptions('keep.trailing.zeros',TRUE)
pander(dt, split.cell = 80, split.table = Inf)
```

结果

-------------------------------
 id     description      value 
---- ------------------ -------
 1   description string  10000 

 2   description string  10000 

 3   description string  10001 
-------------------------------

想看看

----------------------------------
 id     description      value 
---- ------------------ ----------
 1   description string  10000.41 

 2   description string   9999.68 

 3   description string  10000.64 
----------------------------------

【问题讨论】:

  • 我的第一个更改是删除数字选项。如果它链接到 R 中的 signif 函数,它将产生您所看到的效果:signif( mean(rnorm(1000,1000)), 2) 返回[1] 1000。而signif( mean(rnorm(10,1000, 200)), 2) 返回[1] 990
  • digits 增加到 7。
  • 将数字设置为 7 会给我9999.677(即小数点后 3 位)或10000.64。如果我将数字设置为 7 并舍入为 2 panderOptions('digits',7); panderOptions('round',2),那么我会得到想要的结果。似乎比一般解决方案更像是一种解决方法,因为它不能一致地应用于所有数据,我需要知道我的数据中有多少位数并进行适当调整。如果 pander 的行为方式与 kable(x, digits=2) 类似,这将导致小数点后两位数,那就太好了。
  • @DavidDickson knitr::kabledigits 传递给round——你也可以通过将round 设置为round 来实现2,我认为这很理智,而且提供了极大的灵活性。将大的digitsround 设置为2 有什么问题?

标签: r r-markdown pander


【解决方案1】:

?panderOptions 页面指出,“digits”被传递给 format,在那里它被解释为“有效数字”的数量。有效数字实际上与小数位几乎没有关系。十进制值 0.000041 中可以有 2 个有效数字。您可以看到参数对format()-ed 值的影响:

> format(c( 10000.41,  9999.68, 10000.64 ), digits=2)
[1] "10000" "10000" "10001"

您确实希望将“round”选项保留为 2。

【讨论】:

  • 删除panderOptions('digits',2) 并保留panderOptions('round',2) 产生了完全相同的结果。
  • 也许数字设置是“持久的”?您是否尝试将其设置为 NA 或 7?
  • @42- 将digits 设置为7 将达到预期的效果,请参阅我上面的评论。
【解决方案2】:

设置round 对位数没有任何直接影响(尽管由于可能使数字变得微不足道(0)会产生一些间接影响)。这里的主要问题是 pander 不允许你设置 format()nsmall 参数,这将设置

以非科学格式格式化实数/复数时小数点右侧的最小位数。允许的值为 0

但由于 pander 只将数值提供给 format(),您可以通过将值 as.character() 提供给 pander 来解决这个问题:

library (data.table)
library(magrittr)
library (pander)

set.seed(1984)
longString <- "description string"
dt <- data.table(id = c(1:3),
                 description = rep(longString, 3),
                 value = rnorm(3, mean = 10000, sd = 1))

pander(
  x = dt %>% mutate(value = value %>% round(2) %>% as.character()),
  split.cell = 80,
  split.table = Inf,
  justify = "ccr"
)

导致:

------------------------------------
 id      description           value
---- -------------------- ----------
 1    description string    10000.41

 2    description string     9999.68

 3    description string    10000.64
------------------------------------

【讨论】:

    【解决方案3】:

    问题出在digits 部分。您必须将数字增加到小数点前后的最大位数。您的最大数字(有关数字)在小数点前有 5 位,小数点后有 2 位(例如 10000.41)。所以你需要将数字设置为 7 并(离开)在 2 处舍入:

    ```{r pander-table}
    panderOptions('round',2)
    panderOptions('digits',7)
    panderOptions('keep.trailing.zeros',TRUE)
    pander(dt, split.cell = 80, split.table = Inf)
    ```
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多