如何在kableExtra中为整数显示小数点(如7显示为7.0)
统一R表格数字小数位数的解决方案
问题背景
拥有如下R数据框:
data <- structure(list(Model = c("ARIMA", "Actual", "Forecast", "Error", "STIF", "Actual", "Forecast", "Error", "Adjusted Forecast", "Actual", "Forecast", "Error"), `*Dec 2022` = c(NA, 6.9, 6.8, 0.1, NA, 6.9, 6.6, 0.3, NA, 6.9, 6.7, 0.2), `*Jan 2023` = c(NA, 7, 6.8, 0.2, NA, 7, 6.8, 0.2, NA, 7, 6.9, 0.1), `*Feb 2023` = c(NA, 7.2, 6.2, 1, NA, 7.2, 6.9, 0.3, NA, 7.2, 6.6, 0.6), Average = c(NA, 7, 6.6, 0.4, NA, 7, 6.8, 0.3, NA, 7, 6.7, 0.3)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame"))
当前使用kableExtra和tidyverse生成表格的代码:
library(kableExtra) library(tidyverse) data %>% mutate_if(is.numeric, ~as.character(.)) %>% replace(is.na(.), " ") %>% kable(caption="Short-Term Forecast Errors \\label{Table6}", booktabs = T, escape = FALSE, align = 'lcccc') %>% kable_styling(latex_options = c("HOLD_position"), font_size = 9)
需要让表格内所有数字统一显示一位小数(例如整数7显示为7.0)。
解决方案
修改数值列的格式化逻辑,在转换为字符前统一保留一位小数,代码如下:
library(kableExtra) library(tidyverse) data %>% mutate(across(where(is.numeric), ~sprintf("%.1f", .x))) %>% # 格式化所有数值列为1位小数 replace(is.na(.), " ") %>% kable(caption="Short-Term Forecast Errors \\label{Table6}", booktabs = T, escape = FALSE, align = 'lcccc') %>% kable_styling(latex_options = c("HOLD_position"), font_size = 9)
关键说明:
- 用
across(where(is.numeric), ...)替代旧版的mutate_if,这是tidyverse新版本推荐的语法,更清晰灵活 sprintf("%.1f", .x)会将每个数字格式化为带1位小数的字符串,自动为整数补.0(如7→7.0)- 若偏好更直观的函数,也可以用
format(.x, nsmall = 1)替代sprintf,效果完全一致:mutate(across(where(is.numeric), ~format(.x, nsmall = 1)))
内容的提问来源于stack exchange,提问作者Tanga94
相关产品推荐
相关产品推荐

