计算R中数字的有效数字

时间:2018-08-24 16:10:00

标签: r

也许是一个愚蠢的问题,但是为什么R在数字末尾删除有效的0?例如,1.250变为1.25,其精度不相同。我一直在尝试通过结合使用as.character()gsub()和正则表达式(根据各种帖子)来计算数字的有效位数,但是对于诸如1.250这样的数字,我得到了错误的结果,因为as.character删除了最后0位数字。因此,1.250的答案是2位数字,而不是3位数字。

更具体地说,为什么这对我来说是个问题:

我的单词表很长,包含键长,格式为:1.2450(20):

enter image description here

括号中的数字是测量中的不确定性,这意味着真实值在1.2450 + 0.0020和1.2450-0.0020之间。我已经从单词中将所有这些数据导入到一个大数据框中,如下所示:

df<-data.frame(Activity = c(69790, 201420, 17090),
               WN1=c(1.7598, 1.759, 1.760),
               WN1sd=c(17, 15, 3))

我的目的是针对活动绘制WN1值,但还要打开误差条。这意味着我将需要手动将WN1sd转换为:WN1sd=c(0.0017, 0.015, 0.003),这不是R的解决方法,因此需要获得WN1的有效位数。这对于前两个WN1值而言效果很好,但对于第三个WN1值而言效果不佳,因为R错误地认为最后一个0不重要。

2 个答案:

答案 0 :(得分:1)

从Word文档导入数据时,您必须准备标准差

有一点,你应该有这样的字符串:

"1.2345(89)" "4.230(34)" "3.100(7)"

这是一个函数,您可以将其应用于这些字符并正确获取sd:

split.mean.sd = function(mean.sd) {
   mean <- gsub("(.*)\\(.*", "\\1", mean.sd)
   sd  <- gsub(".*\\((.*)\\)", "\\1", mean.sd)
   digits.after.dot <- nchar(gsub(".*\\.(.*).*", "\\1", mean))
   sd  <- as.numeric(sd)*10^(-digits.after.dot)
   mean <- as.numeric(mean)
   c(mean, sd)
   }

例如:

v <- c("1.2345(89)","4.230(34)","3.100(7)")
sapply(v, split.mean.sd)

给你

     1.2345(89) 4.230(34) 3.100(7)
[1,]     1.2345     4.230    3.100 
[2,]     0.0089     0.034    0.007

答案 1 :(得分:0)

大多数编程语言(包括R)不跟踪浮点值的有效位数。这是因为在许多情况下,没有必要使用有效数字,这将大大减慢计算速度并需要更多RAM。

您可能希望对某些不确定的计算库感兴趣,例如errors(PDF)软件包。

相关问题