R /用科学计数法用 Sexpr {}格式化数字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R /用科学计数法用 Sexpr {}格式化数字相关的知识,希望对你有一定的参考价值。

我刚刚开始用Sweave/R写一些文档,我喜欢sexpr{}命令,让一个拖拽直接在文本中写入数字。

如果我有一个像mus=0.0002433121这样的数字,那么我可以把它四舍五入到多个小数位,例如

Sexpr{round(mus,7)}

如何用科学记数法写出来,即LaTeX将输出

2.43 	imes 10^{-4} 

在这个例子中,我们可以控制输出的有效位数,如3吗?

我注意到,如果我指定的话,像sigma = 2000000这样的数字会自动写入2e + 06

Sexpr{round(sigma,2)}. 

我希望它会写成

2 	imes 10^6 

与我们在LaTeX表示法中得到的相同,也许我们也可以控制有效数字的数量。

怎么做到这一点?

答案

我认为这个功能应该有效:

sn <- function(x,digits)
{
  if (x==0) return("0")
  ord <- floor(log(abs(x),10))
  x <- x / 10^ord
  if (!missing(digits)) x <- format(x,digits=digits)
  if (ord==0) return(as.character(x))
  return(paste(x,"\times 10^{",ord,"}",sep=""))
}

一些测试:

> sn(2000000)
[1] "2\times 10^{6}"
> sn(0.001)
[1] "1\times 10^{-3}"
> sn(0.00005)
[1] "5\times 10^{-5}"
> sn(10.1203)
[1] "1.01203\times 10^{1}"
> sn(-0.00013)
[1] "-1.3\times 10^{-4}"
> sn(0)
[1] "0"

如果您希望结果处于数学模式,您可以在$调用中输入paste()标志。

Edit:

这是一个Sweave示例:

documentclass{article}

egin{document}
<<echo=FALSE>>= 
sn <- function(x,digits)
{
  if (x==0) return("0")
  ord <- floor(log(abs(x),10))
  x <- x / 10^ord
  if (!missing(digits)) x <- format(x,digits=digits)
  if (ord==0) return(as.character(x))
  return(paste(x,"\times 10^{",ord,"}",sep=""))
}
@

Blablabla this is a pretty formatted number $Sexpr{sn(0.00134,2)}$.

end{document}
另一答案

使用siunitx link to pdf的一个例子。在序言中,您可以定义默认选项,稍后可以在文档中覆盖这些选项。

对于数字输出:

num <- function(x,round_precision=NULL)
{
  if (is.null(round_precision)) {
    return(sprintf("
um{%s}", x))
  } else {
    return(sprintf("
um[round-precision=%s]{%s}",round_precision, x))
  }
}

对于科学输出:

sci<- function(x,round_precision=NULL){
  if (is.null(round_precision)) {
  return(sprintf("
um[scientific-notation = true]{%s}", x))
} else {
  return(sprintf("
um[round-precision=%s,scientific-notation = true]{%s}",round_precision, x))
}
}

siunitx example

这是一个完全可重现的.Rnw脚本(与knitr一起使用...用于sweave在函数中使用四个反义,而不是两个看到这个SO post。)

documentclass[a4paper]{article}
usepackage{siunitx}
%usepackage{Sweave}
	itle{siunitx}

sisetup{
round-mode = figures,
round-precision = 3,
group-separator = 	ext{~}
}
egin{document}

maketitle
<<sanitize_number,echo=FALSE>>=
num <- function(x,round_precision=NULL)
{
  if (is.null(round_precision)) {
    return(sprintf("
um{%s}", x))
  } else {
    return(sprintf("
um[round-precision=%s]{%s}",round_precision, x))
  }
}

sci<- function(x,round_precision=NULL){
  if (is.null(round_precision)) {
  return(sprintf("
um[scientific-notation = true]{%s}", x))
} else {
  return(sprintf("
um[round-precision=%s,scientific-notation = true]{%s}",round_precision, x))
}
}

@
Examples :
$num$ for number formatting :

egin{itemize}
item 	extbf{num(pi, round\_precision=2)} $Rightarrow$

um[round-precision=2]{3.14159265358979} 
item 	extbf{num(pi, round\_precision=4)}  $Rightarrow$

um[round-precision=4]{3.14159265358979}
item The default formatting (here round-precision=3) is taken from
	extbf{	extbackslash sisetup} 
	extbf{num(pi)}  $Rightarrow$ 
um{3.14159265358979}
end{itemize}


oindent $sci$ for scientific notation :

egin{itemize}
item 	extbf{sci(12.5687e4)}  $Rightarrow$ 
um[scientific-notation =
true]{125687}
item 	extbf{sci(125687.11111)}  $Rightarrow$

um[scientific-notation = true]{125687.11111}
item 	extbf{sci(125687.11111, round\_precision=4)} $Rightarrow$
 Sexpr{sci(125687.11111, round_precision=4)}
end{itemize}

end{document}

以上是关于R /用科学计数法用 Sexpr {}格式化数字的主要内容,如果未能解决你的问题,请参考以下文章

为啥用excel输入长数字就变成科学记数法?

PHP 用科学记数法格式化数字

csv文件 长数据 用excel打开为科学计数法 用记事本打开显示为准确的数字 如何用excel打开也是准确数字

如何让EXCEL中的数据用科学计数法显示

excel 怎么让数字不用科学计数法

excel解决超长数字显示科学记数法