我正在寻找像0.1298这样的数字的舍入行为,以显示为0.130,同时保持尾随的零作为有效数字.这也需要对小数长度不同的表起作用.我使用signif()对数据进行四舍五入,除了R丢失尾随零之外,它工作得很好,但为了保证准确性,它是必需的.对此有什么有效的功能吗?

有没有人给我出个好主意?已经非常感谢了!

我已try 修改标志


mod_signif <- function(x,digits) {
   sprintf(paste0('%#.',3,'g'), signif(x,digits))}

这对于小数点后5位的数字很有效,在此之后科学写作就开始了.

> mod_signif(0.129554,3)
[1] "0.130"
> mod_signif(0.0129554,3)
[1] "0.0130"
> mod_signif(0.00129554,3)
[1] "0.00130"
> mod_signif(0.000129554,3)
[1] "0.000130"
> mod_signif(0.0000129554,3)
[1] "1.30e-05"

在这种情况下,我预计是0.0000130美元

如果我试图用Format()函数来抵消这一点,我就会开始绕圈子,因为我会返回到数字,并再次丢失零……

推荐答案

你可以用scales::label_number()美元.由于Scale包中的标签器的工作方式,这需要在另一个函数体中创建一个函数.

还要注意,您需要进行一些简单的算术运算才能将signif()期望的参数转换为label_number()期望的参数.

library(scales)

label_nicely <- function(number, digits){
  
  ## I stole this from the documentation for base::round
  ## Pretty neat, huh?
  round_to <- digits - ceiling(log10(abs(number)))
  
  value <- round(number, round_to)
  
  ## accuracy is expected to be (e.g.) 0.01 rather than, say, 3
  accuracy_arg <- 1 / 10^round_to
  
  ## Construct a labeller within the function run
  labeller <- label_number(accuracy = accuracy_arg)
  
  label <- labeller(value)
  
    return(label)
} 

label_nicely(0.129554,3)
#> [1] "0.130"
label_nicely(0.0000129554, 3)
#> [1] "0.0000130"

创建于2023-09-15年第reprex v2.0.2


编辑: 对base::round的描述告诉我们,signif(n, x)等于round(n, x - ceiling(log10(abs(n))).使用这个技巧,我们可以将"有效数字"转换为"实际数字",我们可以将其传递给label_number()accuracy参数以获得所需的行为.

R相关问答推荐

R gtsummary tBL_summary,包含分层和两个独立分组变量

从载体创建 pyramid

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

如何从其他前面列中减go 特定列的平均值?

使用lapply的重新定位功能

在特定列上滞后n行,同时扩展框架的长度

R等效于LABpascal(n,1)不同的列符号

为什么观察不会被无功值变化触发?

跨列查找多个时间报告

R如何计算现有行的总和以添加新的数据行

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

在数据帧列表上绘制GGPUP

将具有坐标列表列的三角形转换为多个多边形

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

R基于变量组合创建新的指标列

使用geom_sf跨越日期线时的闭合边界

如何使用包metaviz更改标签的小数位数?

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

识别部分重复行,其中一行为NA,其重复行为非NA

根据向量对列表元素进行排序