首页 > 解决方案 > 为什么 rmarkdown 基于最小值的位数对列进行舍入?

问题描述

我有一个包含两个数字列的数据框。knitr::opts_chunk$set(echo = TRUE, options(digits=2))我正在尝试通过根据条件进行选择来制作不同的数据框,并将它们输出到一个 rmarkdown html 文档中,通过设置和打印表格来四舍五入到小数点后两位,kable但这并没有按预期工作。我还尝试使用options(scipen=1, digits=2)基于以前的解决方案来解决类似问题。

如果列中的最小数字 >=10 且 <99,则它将整列四舍五入到最接近的整数。(10.931 变为 11)

如果最小数字 >=1 且 <10,则四舍五入到小数点后一位。(1.0931 变为 1.1)

如果最小的数字小于1,我只能达到两位小数,而当最小的数字<0.1时,我仍然只能得到两位小数。(0.010931 变为 0.01)。这对我来说不是问题,因为我只想要两位小数,但我确信这与我遇到的问题有关,所以我想我会包括它。

位数基于列中的最小数字,但适用于整个列。我怎样才能使所有数字都包含两位小数?

标签: rr-markdowndigitskable

解决方案


设置options(digits=2)(在它自己的行上,而不是在里面knitr::opts_chunk$set)设置全局的位数,因为kable从这个选项获取它的默认位数(你可以在帮助中看到这个kable)。

但是,digits参数被传递给round函数,该函数将尽可能舍入到比该值低的小数位数digits

据我所知,如果要保证特定位数,则需要使用sprintf(可能还有其他我不知道的选项)。即使format不保证特定的小数位数(帮助说:)"The default, NULL, uses getOption("digits"). This is a suggestion: enough decimal places will be used so that the smallest (in magnitude) number has this many significant digits, and also to satisfy nsmall"

这里有些例子:

library(knitr)
library(tidyverse)

d = tibble(x=c(1,15,99,101,1001))
kable(d)
X
1
15
99
101
1001
options(digits=2)
kable(d)
X
1
15
99
101
1001
d = tibble(x=c(1.5495389,15,99,101,1001.152))
kable(d)
X
1.6
15.0
99.0
101.0
1001.1
options(digits=3)
kable(d)
X
1.55
15.00
99.00
101.00
1001.15
options(digits=7)
kable(d)
X
1.549539
15.000000
99.000000
101.000000
1001.152000
# format function
d %>% 
  mutate(x = format(x, digits=4)) %>% 
  kable(align="r")
X
1.55
15.00
99.00
101.00
1001.15
# sprintf function
d %>% 
  mutate(x = sprintf("%1.4f", x)) %>% 
  kable(align="r")
X
1.5495
15.0000
99.0000
101.0000
1001.1520
# sprintf function
d %>% 
  mutate(x = sprintf("%1.10f", x)) %>% 
  kable(align="r")
X
1.5495389000
15.0000000000
99.0000000000
101.0000000000
1001.1520000000

reprex 包于 2021-09-27 创建(v2.0.1)


推荐阅读