【问题标题】:Rounding significant figures in R在 R 中舍入有效数字
【发布时间】:2017-08-15 00:54:09
【问题描述】:

所以基本上我正在做一个物理实验,在我的表格中,我希望将我的数据四舍五入到与错误相同的精度,即四舍五入到 1 sig fig。

例如,如果我有以下情况:

angle <- c(4, 4.1, 4.2)
angle.error <- c(0.024, 0.3, 0.113)
data <- data.frame(angle,angle.error)

想要我最终得到的是将角度误差四舍五入到 1 sig fig,并将角度四舍五入到相应的小数位数作为角度误差,给出

angle <- c(4.00, 4.1, 4.2)
angle.error <- c(0.02,0.3,0.1)
data <- data.frame(angle, angle.error)

希望这是有道理的!这是我们被教导呈现数据的标准方式,因此我很惊讶我发现找到正确的方式来做这件事是多么困难。任何贡献都会很棒!

编辑:

如果我想把它变成一个 UDR,假设数据在第 5 列,错误在我的数据框的第 6 列,我写:

Conv2 <- function(x) {
x[6] <- signif(x[6],1)
exp <- floor(log10(x[6]))
man <- x[6]/10^exp         
x[5] <- round(x[5], -exp)   # Error associated with this line I think
sapply(seq_along(x[5]), function(i) format(x[i,5], nsmall=-exp[i]))

return(x)
}

当我实现它时,我得到了错误 'FUN(X[[i]], ...) 中的错误:数学函数的非数字参数'

【问题讨论】:

  • 我可能需要澄清一下。您是否使用“1dp”来表示 1 个有效数字或 1 个小数位。如果您没有将 1dp 与 1 sig fig 互换使用,那么您的输出似乎不太正确。此外,您说您希望 angle 舍入到与 angle.error 相同数量的 sigfigs,但您的输出使用两个 sigfigs 来表示 angleangle.error 只有一个。
  • 是的,很抱歉我弄错了 - 我现在已经编辑它以使其有意义

标签: r rounding presentation significant-digits


【解决方案1】:

这可以通过signif() 完成。与 round() 舍入到小数位数不同,signif() 舍入到特定的有效位数。

x <- c(1,1.0001,0.00001)
round(x,1) # rounds to the specified number of decimal places
signif(x,1) # rounds to the specified number of significant digits

让我们将此应用于您的案例。请注意,signif 在两个参数上进行了矢量化处理。

> signif(c(1.111,2.222,3.333),c(1,2,3))
[1] 1.00 2.20 3.33

这对您的情况意味着以下内容:

angle.error <- c(0.024, 0.3, 0.113)
cor <- signif(angle.error,1)

圆角稍微困难一些。我们需要将角度四舍五入到与 angle.error_corr 相同的小数位数。因此我们将提取这个数的尾数和指数。

exp <- floor(log10(cor)) 
man <- cor/10^exp

现在可以使用指数来圆角。

angle <- c(4, 4.1, 4.2)
angle_cor <- round(angle, -exp)

但是,这并没有给出预期的结果,因为 R 显示了最精确的 double 的位数并删除了尾随零。我们可以用 format 的 nsmall 参数来解决这个问题,不幸的是它没有向量化。

sapply(seq_along(angle), function(i) format(angle[i], nsmall = -exp[i]))

这应该会给你你正在寻找的答案。

【讨论】:

  • @Nick Siemons,稍微更新了答案,以便它也描述了您的具体情况。
  • 谢谢你,我试了一下。理想情况下,我希望这是一个 UDF,我已经尝试过这样做。不幸的是,当我实施它时出现错误 - 请参阅我的帖子上的编辑。有什么想法吗?
  • 好的,整理好了!必须添加 exp
猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2010-09-27
相关资源
最近更新 更多