2012-07-05 5 views
6

を使用してフォーマット番号にR関数は、(...キロ、メガなど)標準単位プレフィックスを使用してフォーマット番号(整数)を可能にするがRの関数(またはパッケージ)があるので、単位プレフィックス

10 -> 10 
100 -> 1K 
0.01 - > 10m 

など... 私はそれを自分で行うことができますが、私は車輪を再発明したくないです。

+0

'utilsパッケージ::: print.object_size'は、私はちょうどこのW/O校正を行うことについての注意が必要となるいくつかのバイナリ単位 – James

+0

のためにそれを実装しています。例えば、3.5MmのようなものはISOによって許可されていますが、標準的な使用法では誰もが3.5e3kmで行く。無次元の値には接頭辞を使用しないので、物理ユニット自体をどのように追加する予定ですか? –

+0

私はあなたの意見を見ます。しかし、私がやっていることは「深刻」ではなく、私は何のユニットも持っていません。私はプロット/テーブルに値を表示しているだけで、3/4文字に合わせるためにはすべてが必要です。 10kは1000または1e + 03よりもコンパクトです。 – mb14

答えて

10
require(sitools) 
f2si(80000) 
[1] "80 k" 
f2si(8E12) 
[1] "8 T" 

二つのスペースを追加して何のSI接頭辞が使用されていない場合は非常に単純であるように思わ:

f2si(80) 
[1] "80 " 

関数は丸めを含めるように変更することは容易です。私はまた、添付されたスペースで問題を修正しました。

f2si2<-function (number,rounding=F) 
{ 
    lut <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12, 1e-09, 1e-06, 
     0.001, 1, 1000, 1e+06, 1e+09, 1e+12, 1e+15, 1e+18, 1e+21, 
     1e+24) 
    pre <- c("y", "z", "a", "f", "p", "n", "u", "m", "", "k", 
     "M", "G", "T", "P", "E", "Z", "Y") 
    ix <- findInterval(number, lut) 
    if (lut[ix]!=1) { 
     if (rounding==T) { 
     sistring <- paste(round(number/lut[ix]), pre[ix]) 
     } 
     else { 
     sistring <- paste(number/lut[ix], pre[ix]) 
     } 
    } 
    else { 
     sistring <- as.character(number) 
    } 
    return(sistring) 
} 

f2si2(12345) 
[1] "12.345 k" 
f2si2(12345,T) 
[1] "12 k" 
+0

まさに私が念願しているようだが何らかの理由で私はそれをインストールすることができない:-( – mb14

+0

まあ、どんなR版がCRANミラー?... – Roland

+0

R 2.9.0、英国(ロンドン) – mb14

7

私は同じ質問でここに来ました。彼の答えはRolandのおかげです。私はいくつかの変更と彼のコードの上に構築された:(単に「有意性」組み込み関数のように6デフォルト)= FALSEを丸める際

  • は、有効数字を指定することができます
  • することは値を使用して、エラーをスローしません1E-24
  • 出力科学的表記法(単位なし)以下1e27

上記の値のため、これは有用であることを望みます。

f2si<-function (number, rounding=F, digits=ifelse(rounding, NA, 6)) 
{ 
    lut <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12, 1e-09, 1e-06, 
     0.001, 1, 1000, 1e+06, 1e+09, 1e+12, 1e+15, 1e+18, 1e+21, 
     1e+24, 1e+27) 
    pre <- c("y", "z", "a", "f", "p", "n", "u", "m", "", "k", 
     "M", "G", "T", "P", "E", "Z", "Y", NA) 
    ix <- findInterval(number, lut) 
    if (ix>0 && ix<length(lut) && lut[ix]!=1) { 
     if (rounding==T && !is.numeric(digits)) { 
      sistring <- paste(round(number/lut[ix]), pre[ix]) 
     } 
     else if (rounding == T || is.numeric(digits)) { 
      sistring <- paste(signif(number/lut[ix], digits), pre[ix]) 
     } 
     else { 
      sistring <- paste(number/lut[ix], pre[ix]) 
     } 
    } 
    else { 
     sistring <- as.character(number) 
    } 
    return(sistring) 
} 

f2si(12345) 
[1] "12.345 k" 
f2si(12345, T) 
[1] "12 k" 
f2si(10^31) 
[1] "1e+31" # (previous version would output "1e+07 Y" 
f2si(10^-25) 
[1] "1e-25" # (previous version would throw error) 
f2si(123456789) 
[1] "123.457 M" # (previous version would output ""123.456789 M" 
f2si(123456789, digits=4) 
[1] "123.5 M" # (note .456 is rounded up to .5) 

このコードから、よく使用される財務単位(K、MM、Bn、Tr)についても同様の機能を記述するのは簡単です。

1

僅かに負の数を考慮するように改変バージョン:

f2si<-function (number, rounding=F, digits=ifelse(rounding, NA, 6)) 
{ 
mysign <- "" 
if (number<0) { 
    mysign <- "-" 
} 
number <- abs(number) 
lut <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12, 1e-09, 1e-06, 
    0.001, 1, 1000, 1e+06, 1e+09, 1e+12, 1e+15, 1e+18, 1e+21, 
    1e+24, 1e+27) 
pre <- c("y", "z", "a", "f", "p", "n", "u", "m", "", "k", 
    "M", "G", "T", "P", "E", "Z", "Y", NA) 
ix <- findInterval(number, lut) 
if (ix>0 && ix<length(lut) && lut[ix]!=1) { 
    if (rounding==T && !is.numeric(digits)) { 
     sistring <- paste(mysign,mysign,round(number/lut[ix]), pre[ix]) 
    } 
    else if (rounding == T || is.numeric(digits)) { 
     sistring <- paste(mysign,signif(number/lut[ix], digits), pre[ix],sep="") 
    } 
    else { 
     sistring <- paste(mysign,number/lut[ix], pre[ix],sep="") 
    } 
} else { 
    sistring <- paste(mysign,as.character(number),sep="") 
} 
return(sistring) 

}

1

I千(K)、百万(M)と億円(B)数変換を探していました。このルーチンを変更して、数値ベクトル/単一の数値を必要な出力から吐き出すようにしました。

CurrencyFormat <-function (number,rounding=F) 
{ 
    first <- TRUE 
    lut <- c(1, 1000, 1000000, 1000000000,1000000000000) 
    pre <- c("", "K", "M", "B", "T") 
    if (length(number) > 1) { 
     for (cnt in 1:length(number)){   
      ix <- findInterval(number[cnt], lut) 
      if (ix != 0 | ix != 1){ 
       if (rounding==T) { 
        sistring <- paste(round(number[cnt]/lut[ix]), pre[ix]) 
       } 
       else { 
        sistring <- paste(signif(number[cnt]/lut[ix],digits=5), pre[ix]) 
       } 
       if (first){ 
        tnumber <- sistring 
        fnumber <- tnumber 
        first <- FALSE 
       } 
       else 
        fnumber <- append(fnumber, sistring) 
      } 
      else { 
       sistring <- number[cnt] 
       if (first){ 
        tnumber <- sistring 
        fnumber <- tnumber 
        first <- FALSE 
       } 
       else 
        fnumber <- append(fnumber, sistring) 
      } 
     } 
     return(fnumber) 
    } 
    else{ 
     ix <- findInterval(number, lut) 
     if (ix != 0 | ix != 1){ 
      if (rounding==T) { 
       sistring <- paste(round(number/lut[ix]), pre[ix]) 
      } 
      else { 
       sistring <- paste(signif(number/lut[ix],digits=5), pre[ix]) 
      } 
      return(sistring) 
     }  
     else 
      return(number) 
    } 
} 

例:

CurrencyFormat(1.25,F) 
[1] "1.25 " 

CurrencyFormat(1000.25,F) 
[1] "1.0002 K" 

CurrencyFormat(c(1,45,1234, 4.36e+06, 2.84e+04, 2.01e+06),F) 
[1] "1 "  "45 "  "1.234 K" "4.36 M" "28.4 K" "2.01 M"