Завершающие нули после последовательного округления с помощью round(), за которым следует signif()

Я пытаюсь применить функцию последовательного округления к любому вещественному числу, чтобы выполнялось следующее условие: «Числа должны указываться не более чем с двумя десятичными цифрами и не более чем с двумя значащими цифрами».

Например:
0,0236 следует указывать как 0,02
0,236 следует указывать как 0,24
2,36 следует указывать как 2,4
23,6 следует указывать как 24
236 следует указывать как 240

Кажется, что всякий раз, когда после округления с round и signif есть конечные нули, они опускаются (например, 0,90023 становится 0,9 вместо 0,90). Я пробовал следующий фрагмент кода:

    my_round <- function(x1) {
            x2 <- formatC(x1, digits=2, format="f", drop0trailing=FALSE)
            x2 <- as.numeric(x2)
            x3 <- formatC(x2, digits=2, format="fg", flag="#", drop0trailing=FALSE)
            x3 <- as.numeric(x3)
            print(x3)
    }

Это прекрасно работает для любого числа, кроме таких, как 195 (более двух значащих цифр в их целой части), которое остается 195, а не округляется до 200.

Буду признателен за любую помощь по этой теме.
(R v3.1.0, 10 апреля 2014 г.)


person user3806114    schedule 24.07.2014    source источник


Ответы (3)


Вы можете комбинировать функцию sprintf и идеи, обсуждаемые здесь .

ceil.ten <- function(x) 
  if (x > 100) ceiling(x/10)*10 else x

sprintf("%.2f", ceil.ten(0.0236))
# [1] "0.02"
sprintf("%.2f", ceil.ten(0.236))
# [1] "0.24"
sprintf("%.2f", ceil.ten(2.36))
# [1] "2.36"
sprintf("%.2f", ceil.ten(23.6))
# [1] "23.60"
sprintf("%.2f", ceil.ten(236))
# [1] "240.00"
sprintf("%.2f", ceil.ten(195))
# [1] "200.00"
person javlacalle    schedule 24.07.2014

Попробуй это:

## Install the prettyprint package
install.packages("devtools")
devtools::install_github("prettyprint/prettyprint")

## 
library(prettyprint)

x = c(0.0236, 0.236, 2.36, 23.6, 236, 0.90023, 195)
pp(x, digits = 2)

Выход:

0.02 0.24  2.4   24  240 0.90  200
person prettyprint    schedule 07.01.2016

Кажется, что одним из возможных решений этой конкретной проблемы является:

    my_round <- function(x1) {
            x2 <- formatC(x1, digits=2, format="f", drop0trailing=FALSE)
            x2 <- as.numeric(x2)
            if(x2<100) {
                    x3 <- formatC(x2, digits=2, format="fg", flag="#")
                    x3 <- as.numeric(x3)
            }        
               else {
                    x3 <- signif(x2, digits=2)
            }
            print(x3)
     }
person user3806114    schedule 25.07.2014