【问题标题】:Round up values to a specific significant figure in R将值四舍五入到 R 中的特定有效数字
【发布时间】:2016-06-02 05:54:42
【问题描述】:

将值四舍五入为特定有效数字的最简单方法是什么?

类似于函数signif(),但只执行向上舍入(而不是向下舍入)

例如:将 0.001145288 向上舍入到 1 个有效数字将得到 0.002

任何建议将不胜感激:)

干杯!

【问题讨论】:

    标签: r rounding significant-digits


    【解决方案1】:

    此函数在一个有效数字的情况下提供所需的输出:

    upround1 <- function(x) {
             if (isTRUE(all.equal(x,0))) return (x)
             decs <- 10^floor(log10(abs(x)))
             ceiling(x/decs)*decs
             }
    

    例子:

    upround1(0.001145288)
    #[1] 0.002
    upround1(0.0008145258)
    #[1] 9e-04
    upround1(11)
    #[1] 20
    upround1(-11)
    #[1] -10
    upround1(-0.023)
    #[1] -0.02
    

    【讨论】:

    • 它适用于我的示例。但它并不适用于所有情况:(
    • 如果 x
    • 它也会在大于一的数字上失败。例如,f(11) 应该给出 20。
    • @AkselA 感谢您的意见。更新后的版本处理了 Fah Thanchanok Sutjaritham 描述的情况,它还正确考虑了 abs(x) &gt; 10 的情况。
    【解决方案2】:

    我创建了一个函数,它将格式更改为科学格式,将字符串按 'e' 拆分,并使用该信息来限制数字。

    my_ceiling <- function(x){
      num_string <- format(x, scientific=TRUE)
    
      n <- strsplit(num_string, "e")
      n1 <- sapply(n, function(x) as.numeric(x[1]))
      n2 <- sapply(n, function(x) as.numeric(x[2]))
    
      ceiling(n1) * 10^(n2)
    }    
    
    my_ceiling(0.001145288)
    # [1] 0.002    
    
    my_ceiling(0.0974343)
    # [1] 0.1    
    
    my_ceiling(0)
    # [1] 0    
    
    set.seed(1)
    x <- runif(10, 0.001, 0.01)
    my_ceiling(x)
    # [1] 0.004 0.005 0.007 0.010 0.003 0.010 0.010 0.007
    # [9] 0.007 0.002
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多