2012-07-05 5 views
6

을 사용하여 포맷 번호에 R 함수이므로부 프리픽스

10 -> 10 
100 -> 1K 
0.01 - > 10m 
거기를 표준 단위 프리픽스를 사용하여 포맷 번호 있도록 R 함수 (또는 패키지) (정수) (킬로 메가 등)는

등 ... 나는 스스로 할 수 있지만 나는 바퀴를 재발 명하고 싶지 않다. 더 SI 접두어를 사용하지 않을 경우

+0

'유틸 ::: print.object_size' 일부 바이너리 단위 – James

+0

위해 그것을 구현 난 그냥 교정하여 w/o이 일을주의 할 것이다. 예를 들어, 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" 

는 두 개의 공백을 추가로 매우 단순한 것 같다 :

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 버전이 크랭크 미러인가 ...? – Roland

+0

R 2.9.0, 영국 (런던) – mb14

7

나는 같은 질문으로 여기에왔다. 롤랜드에게 감사의 말을 전합니다.

  • 는 유효 숫자가 = FALSE (그냥 'signif'내장 함수 추천 기본값)를 반올림 때
  • 값에 오류가 발생하지 않습니다 지정할 수 있습니다 : 나는 몇 가지 변화가 자신의 코드에 내장 1E-24
  • 출력 표기법 (단위 없음) 값 1e27

호프 위 아래에 유용. 너무, 일반적으로 사용되는 금융 유닛 (K, MM, BN, TR)에 대한 유사한 기능을 작성하는 꽤 쉽게이 코드에서

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) 

.

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

내가 천 (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"