将数字格式设置为R中的有效数字

将数字格式设置为R中的有效数字,r,R,我希望将报表中的数字格式化为,但保留尾随的有效零,并正确格式化大数字 例如,3位有效数字的数字c(10.00001123451234.5123.45,1.2345,0.12345)应该是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)){ +

我希望将报表中的数字格式化为,但保留尾随的有效零,并正确格式化大数字

例如,3位有效数字的数字c(10.00001123451234.5123.45,1.2345,0.12345)应该是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"
>编号(序号中的n){
+打印(签名(数字[n],数字=3))
+打印(格式(数字[n],数字=3))
+打印(formatC(数字[n],数字=3,format=“fg”))
+打印(formatC(数字[n],数字=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结果进行签名和格式化。带flag=“#”的formatC正确处理小数字,但不处理大数字


有更好的方法吗?

你知道
prettyNum()
及其所有选项吗?

一个更简单的选项是
options()
,它只进行四舍五入。如果你打算经常这样做,我建议你去看看swave

> a <- 1.23456789
> options(digits=2)
> a
[1] 1.2
> options(digits=6)
> a
[1] 1.23457
>a选项(数字=2)
>a
[1] 1.2
>选项(数字=6)
>a
[1] 1.23457

很抱歉,我当时从未更新过。我问题中的语句或prettynum都不起作用。最后我使用了

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

它正确地处理了尾随的零和大数字。

如果你喜欢科学记数法

> format(2^31-1, scientific = TRUE, digits = 3)
[1] "2.15e+09"

上面Paul Hurley的方法对正数和负数都很有效。下面是一些代码,它将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

sigfig对Paul答案的另一个修改。它似乎还留下了一个尾随小数。我将用gsub删除它:

sigfig <- function(vec, digits){
  return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}

sigfig也尝试使用apply、lapply和sapply来代替循环…我可能有一个严重的概念错误,但是
apply
函数族不是仍然使用循环吗?但是它抽象了循环,因为代码更干净、更容易阅读,管理更少。对吗?对不起,循环只是用来显示结果的,我原来是这样做的signif(number,digits=3),但出于某种原因,它默认为科学符号。这取决于您的语句的含义。在某些情况下,应用程序系列中的一些成员使用C而不是R进行循环。Lappy的优化使其比for loops.aggregate()和tapply()更快比R中的循环快得多。您还可以让代码继续进行进一步优化。关于您最初的问题,请参阅帮助(格式)。很高兴看到使用
formatC()
是解决方案[当我将该函数移植到R时,特别是引入了
format=“fg”
我自己考虑了很多。通常,现在,
sprintf()
通常比formatC()更受欢迎,但事实上,我没有看到通过sprintf()而不是formatC()获得解决方案的好方法。顺便说一句:考虑到你的
数字
,我发现使用
sapply
而不是for循环
sapply很方便(数字,函数(N)formatC(signif(N,digits=3),digits=3,format=“fg”,flag=“#”)
不能
formatC
fg
找到有效数字,所以
signif
是不需要的?formatC帮助我满足了上一次的格式要求。我发现我不得不用ifelse来实现它,输入值>=1时使用“digits=0,format=“f”“digits=1,format=“fg”表示值<1,以获得我所需的值。感谢@MartinMächler提供的
sappy
-解决方案。关于如何将数字格式化为字符的任何提示:
1000->1k
10000->10k
1000000->1M
1e7->10M
?@Jan有一个非常新的软件包可以做到这一点:
sigfig <- function(vec, digits){
  return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#")))
}