【问题标题】:Have three significant decimal digits even with 0 and no decimals in R即使在 R 中为 0 且没有小数,也有三位有效的小数位
【发布时间】:2021-07-05 16:06:50
【问题描述】:

我想返回所有小数点后三位有效数字的数字,即使第三位为零。

例如假设我有

x <- 0.8579
y <- 0.21
z <- 924894.2595

如果我这样做了

x <- signif(x, digits=3) 
y <- signif(y, digits=3) 
z <- signif(z, digits=3) 

我收到x = 0.857 y=0.21 and z=924894

这几乎就是我想要的。我真正想要的是

x = 0.857 y=0.210 and z=924894

我尝试过使用

format(round(x,3), digits=3)

但是这样做我得到了

x = 0.857 y=0.210 and z=924894.259

所以现在我在 z 上有一个问题,因为我实际上想要z=924894

有人知道解决我的问题的答案吗?

【问题讨论】:

  • 你这样做是为了报道,对吧?一旦你使用format 或类似的,你就不再有数字了。
  • 顺便说一句,由于 StackExchange 标签推荐不完善,请多注意您问题中的标签。我删除了三个似乎与您的问题没有直接关系的标签:dplyrtidyversereadr
  • 非常感谢您!对不起标签!
  • 标签非常小,只是提醒您注意,以防您认为标签推荐引擎知道您不知道的事情(它不知道)。很高兴它成功了!

标签: r significant-digits


【解决方案1】:

但是,您对 924894 的预期“有效数字”不正确,因为它显示 6 个有效数字。如果您想“违反”该技术性,那么也许

vec <- c(0.857,0.210,924894.259)
dig <- 3
sprintf(paste0("%0.", ifelse(vec >= (10^dig), "0", dig), "f"), vec)
# [1] "0.857"  "0.210"  "924894"

(我在这里对ifelse 有点草率:从技术上讲,"0" 是字符,dig 是数字/整数。通常不鼓励这样做,并且是强制执行通过dplyr::if_elsedata.table::fifelse。这可能意味着来自ifelse 表达式的返回值可能是character(如果有足够大的话)或integer/numeric(如果没有足够大的话);不过幸运的是,paste0 会以完全相同的方式处理它,因此这里可以接受类不精确的倾斜。如果我想彻底,我会使用 as.character(dig) 代替。)


另一种选择,它分别对每个数字的表观规模做出反应:

vec <- c(0.857,0.210,924894.259,1)
sprintf(paste0("%0.", pmax(floor(3 - log(abs(vec)+0.001, 10)), 0), "f"), vec)
# [1] "0.857"  "0.210"  "924894" "1.00"  

【讨论】:

  • 嘿 r2Evans,你到底在哪里粘贴这个?我一直收到一个错误:“dig not found”
  • r2evans,我非常抱歉,但会回到这个......事实上,它没有达到预期的输出。例如,如果我输入它 1 它输出 1.000 而它应该输出 1.00(三位有效数字)你知道吗?
  • Lola1993 看看我的编辑,也许更接近了。
  • 你是最好的 r2evans!非常感谢你——我自己永远也想不通!
猜你喜欢
  • 2018-09-18
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多