Отформатируйте числа в значащие цифры в R - PullRequest
23 голосов
/ 14 июля 2010

Я хочу отформатировать числа в моих отчетах в значащие цифры , но продолжаю отставать значащие нули и правильно форматировать большие числа

Например, числа 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"

Здесь, знаки отформатируйте результат 10.00001. formatC с флагом = "#" правильно обрабатывает маленькие числа, но не большие.

Есть ли лучший способ?

Ответы [ 6 ]

28 голосов
/ 10 августа 2010

Извините, я никогда не обновлял это в то время.Ни одно из утверждений в моем вопросе, или prettynum не сработало.В конце я использовал

print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#"))

, который правильно справился с конечными нулями и большими числами.

13 голосов
/ 14 июля 2010

Вам известно о prettyNum() и всех его вариантах?

4 голосов
/ 09 февраля 2016

Еще одна модификация ответа Павла. Похоже, что он также оставляет после запятой. Я удаляю его с помощью gsub:

sigfig <- function(vec, digits){
  return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}
4 голосов
/ 14 июля 2010

Более простой вариант - options(), который просто выполняет округление.Если вы планируете делать это много, я предлагаю проверить Sweave.

> a <- 1.23456789
> options(digits=2)
> a
[1] 1.2
> options(digits=6)
> a
[1] 1.23457
3 голосов
/ 05 июня 2015

Метод Пола Херли, описанный выше, хорошо работал для меня как для положительных, так и для отрицательных чисел.Ниже приведен некоторый код, который модифицирует решение Пола в функцию, в которой можно указать желаемые значимые цифры.

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)
3 голосов
/ 04 марта 2012

Если вам нравится научная запись

> format(2^31-1, scientific = TRUE, digits = 3)
[1] "2.15e+09"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...