2012-07-05 23 views
6

Có chức năng R (hoặc bất kỳ gói nào) cho phép định dạng số (số nguyên) sử dụng tiền tố đơn vị chuẩn (Kilo, Mega, v.v.), do đóCó chức năng R để định dạng số sử dụng tiền tố đơn vị

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

etc ... Tôi có thể tự mình làm nhưng tôi không muốn phát minh lại bánh xe.

+0

'utils ::: print.object_size' thực hiện nó cho một số đơn vị nhị phân – James

+0

tôi sẽ chỉ cần cẩn thận về việc này w/o hiệu đính. Ví dụ, trong khi những thứ như 3,5 Mm được cho phép bởi ISO, trong tiêu chuẩn sử dụng tất cả mọi người đi với 3,5e3 km. Vì người ta không bao giờ sử dụng tiền tố cho các giá trị không thứ nguyên, bạn định tự nối các đơn vị vật lý như thế nào? –

+0

Tôi thấy quan điểm của bạn. Tuy nhiên những gì tôi đang làm không phải là "nghiêm trọng" và tôi không có bất kỳ đơn vị nào. Tôi chỉ hiển thị giá trị trong một cốt truyện/bảng và tôi cần tất cả để phù hợp với nó 3/4 ký tự. 10k nhỏ gọn hơn 1000 hoặc 1e + 03. – mb14

Trả lời

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

Nó có vẻ là rất đơn giản vì nó gắn thêm hai khoảng trống nếu không có tiền tố SI được sử dụng:

f2si(80) 
[1] "80 " 

Chức năng rất dễ dàng để sửa đổi để bao gồm làm tròn. Tôi cũng đã khắc phục sự cố với không gian được thêm vào.

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

Dường như chính xác những gì tôi đã đóng, nhưng vì một lý do nào đó, tôi không thể cài đặt nó :-( – mb14

+0

Vâng, phiên bản R nào, mà CRAN phản chiếu, ...? – Roland

+0

R 2.9.0, UK (london) – mb14

7

Tôi đến đây với cùng một câu hỏi. Nhờ Roland cho câu trả lời của mình; Tôi xây dựng trên mã của mình với một vài thay đổi:

  • Cho phép con số đáng kể được xác định khi làm tròn = FALSE (mặc định là 6 giống như 'signif' chức năng dựng sẵn)
  • Không ném ra một lỗi với các giá trị dưới đây 1e-24
  • đầu ra ký hiệu khoa học (không có đơn vị) cho các giá trị trên 1e27

Hy vọng điều này là hữu ích.

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) 

Từ mã này nó khá dễ dàng để viết một chức năng tương tự cho các đơn vị tài chính thường được sử dụng (K, MM, Bn, Tr), quá.

1

Hơi phiên bản sửa đổi để giải thích cho số âm:

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

tôi đang tìm kiếm Thousand (K), triệu (M) và tỷ (B) số chuyển đổi. Tôi đã sửa đổi thói quen này để lấy một số/số đơn khạc ra số lượng yêu cầu.

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) 
    } 
} 

Ví dụ:

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" 
Các vấn đề liên quan