Формат чисел до значительных цифр в R
Я хочу форматировать числа в своих отчетах значащие цифры, но продолжать отслеживать значительные нули и правильно форматировать большие числа
Например, цифры c (10.00001,12345,1234.5,123.45,1.2345,0.12345) до 3 значащих цифр должны быть 10.0, 12300, 1230, 123, 1.23, 0.123, но я получаю разные результаты разными способами (и ни один из них не выглядит работать универсально.
> numbers<-c(10.00001,12345,1234.5,123.45,1.2345,0.12345)
> for(n in seq(numbers)){
+ print(signif(numbers[n],digits=3))
+ print(format(numbers[n],digits=3))
+ print(formatC(numbers[n], digits=3,format="fg"))
+ print(formatC(numbers[n], digits=3,format="fg", flag="#"))
+ }
[1] 10
[1] "10"
[1] " 10"
[1] "10.0"
[1] 12300
[1] "12345"
[1] "12345"
[1] "12345."
[1] 1230
[1] "1234"
[1] "1234"
[1] "1234."
[1] 123
[1] "123"
[1] " 123"
[1] "123."
[1] 12.3
[1] "12.3"
[1] "12.3"
[1] "12.3"
[1] 1.23
[1] "1.23"
[1] "1.23"
[1] "1.23"
[1] 0.123
[1] "0.123"
[1] "0.123"
[1] "0.123"
Здесь, signif и формат вокруг результата 10.00001. formatC с флагом = "#" правильно делает небольшие числа, но не большие числа.
Есть ли лучший способ?
Ответы
Ответ 1
Извините, я никогда не обновлял это в то время. Ни одно из утверждений в моем вопросе, или prettynum не работало. В конце я использовал
print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#"))
который правильно справился с конечными нолями и большими числами.
Ответ 2
Знаете ли вы о prettyNum()
и всех его параметрах?
Ответ 3
Более баребон вариант options()
, который просто округляет. Если вы планируете делать это много, я предлагаю проверить Sweave.
> a <- 1.23456789
> options(digits=2)
> a
[1] 1.2
> options(digits=6)
> a
[1] 1.23457
Ответ 4
Если вам нравится научная нотация
> format(2^31-1, scientific = TRUE, digits = 3)
[1] "2.15e+09"
Ответ 5
Метод Пол Херли выше работал хорошо для меня как для положительных, так и для отрицательных чисел. Ниже приведен код, который модифицирует решение Paul в функцию, в которой могут быть указаны требуемые значащие цифры.
sigfig <- function(vec, n=3){
### function to round values to N significant digits
# input: vec vector of numeric
# n integer is the required sigfig
# output: outvec vector of numeric rounded to N sigfig
formatC(signif(vec,digits=n), digits=n,format="fg", flag="#")
} # end of function sigfig
чтобы проверить, работает ли он ОК
numbers <- c(50000.01, 1000.001, 10.00001, 12345, 1234.5, 123.45, 1.2345, 0.12345, 0.0000123456, -50000.01, -1000.001,-10.00001, -12345, -1234.5, -123.45, -1.2345, -0.12345, -0.0000123456)
sigfig(numbers) # defaults to 3
sigfig(numbers, 3)
sigfig(numbers, 1)
sigfig(numbers, 6)
Ответ 6
Другая модификация ответа Павла. Похоже, что он также оставляет конечное десятичное число. Я удаляю его с помощью gsub:
sigfig <- function(vec, digits){
return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}