舍入R

时间:2017-03-22 18:12:01

标签: r rounding presentation significant-digits

所以基本上我正在做一个物理实验,在我的表格中,我希望我的数据四舍五入到与错误相同的精确度,这四舍五入到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)
}

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

1 个答案:

答案 0 :(得分:3)

可以使用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(c(1.111,2.222,3.333),c(1,2,3))
[1] 1.00 2.20 3.33

我们将此应用于您的案例。请注意,signif在两个参数上都是矢量化的。

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

这意味着您的情况如下:

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

角度越圆越困难。我们需要将角度舍入到与​​angle.error_corr相同的小数位数。因此,我们将提取该数字的尾数和指数。

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

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

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

然而,由于R显示最精确的双精度数字和丢失尾随零的数字,因此不能给出预期的结果。我们可以用格式的nsmall参数来解决这个问题,遗憾的是它没有被矢量化。

TextMode="Date"

哪个应该能给你你想要的答案。