r - 为什么 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)。这对我来说不是问题,因为我只想要两位小数,但我确信这与我遇到的问题有关,所以我想我会包括它。
位数基于列中的最小数字,但适用于整个列。我怎样才能使所有数字都包含两位小数?
解决方案
设置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)
推荐阅读
- docker - 带有 docker-compose 的“坏网关”nginx
- python - 训练模型——我们试图为整个数据集构建预测的类别有多少数据?
- python - 查找由点引用的多边形的最快方法(使用 Python、Fiona 和 Shapely)
- unit-testing - 由于无效的演员阵容,使用 googlemock 模拟副作用失败
- python - python 2x 到 python 3x 代码错误(绕过脚本)
- docker - 为什么 docker build 即使在我设置了时区后仍然询问我时区?
- html - 新页面未呈现 | 不能获取/
- macos - 在 macOS 上断开 Wifi 机场后重新连接?
- python - 如何将 NaN 转换为我的原始数据?
- ios - 如何在 SwiftUI 中制作无限的自定义轮子