Округление до значащих цифр * только * с десятичной частью числа в R

signif() Функция округляет значения на основе заданного количества значащих цифр в данном значении. Эта функция применяется ко всем цифрам в числе, поэтому числа разных порядков округляются и усекаются по-разному. Например, с этим вектором x...

x <- c(100.1303421, 10.03421, 1.3421, 0.0003421)
lapply(x, signif, 2)
#> [[1]]
#> [1] 100
#> 
#> [[2]]
#> [1] 10
#> 
#> [[3]]
#> [1] 1.3
#> 
#> [[4]]
#> [1] 0.00034

… Первое и второе значения усекаются до 100 и 10, а десятичные значения исчезают, в то время как третье и четвертое значения сохраняют десятичные числа (хотя и разные числа). Это ожидаемый результат отsignif()- по праву учитывает все цифры при определении значимых.

Можно ли игнорировать целую часть каждого числа и форматировать только десятичную часть с заданным количеством значащих цифр? Я хотел бы иметь возможность вернуть эти значения: c(100.13, 10.034, 1.34, 0.00034); полное целое число, предшествующее .с последующими значащими цифрами десятичной части числа.

На данный момент я создал функцию, которая разделяет значения на целочисленные и дробные компоненты и запускает signif() только на компоненте дроби, но это кажется исключительно случайным.

signif_ignore_integer <- function(x, digits = 2) {
  as.integer(x) + signif(x - as.integer(x), digits)
}

lapply(x, signif_ignore_integer, 2)
#> [[1]]
#> [1] 100.13
#> 
#> [[2]]
#> [1] 10.034
#> 
#> [[3]]
#> [1] 1.34
#> 
#> [[4]]
#> [1] 0.00034

Есть ли лучший, более рекомендуемый способ (возможно, с какой-то фантазиейsprintf() формат) округлять значения до заданного числа значащих цифр, игнорируя их целочисленные компоненты?

1 ответ

Решение

Возможно, есть лучший способ, но ваш общий подход не кажется необоснованным. Тем не менее, вы можете оптимизировать его с помощью floor, используя векторизацию, чтобы избежать lapplyи используя оператор мода для возврата дробной части каждого числа:

my_signif = function(x, digits) floor(x) + signif(x %% 1, digits)

my_signif(x, 2)
[1] 100.13000  10.03400   1.34000   0.00034
Другие вопросы по тегам