2012-07-05 12 views
6

का उपयोग कर प्रारूप संख्या के लिए एक अनुसंधान समारोहवहाँ इकाई उपसर्ग

10 -> 10 
100 -> 1K 
0.01 - > 10m 
वहाँ एक आर समारोह (या किसी भी पैकेज) प्रारूप संख्या के लिए अनुमति (पूर्णांक) मानक इकाई उपसर्ग का उपयोग करके (किलो, मेगा आदि ...) है, इसलिए

आदि ... मैं इसे स्वयं कर सकता हूं लेकिन मैं पहिया को फिर से नहीं करना पसंद करूंगा।

+0

'utils ::: print.object_size' कुछ द्विआधारी इकाइयों – James

+0

के लिए यह लागू करता है मैं सिर्फ यह w/ओ प्रूफरीडिंग करने के बारे में सावधान रहना होगा। उदाहरण के लिए, आईएसओ द्वारा 3.5 एमएम जैसी चीजों की अनुमति है, मानक उपयोग में सभी 3.5e3 किमी के साथ जाते हैं। चूंकि कोई भी आयामी मानों के लिए उपसर्ग का उपयोग नहीं करता है, इसलिए आप भौतिक इकाइयों को स्वयं कैसे जोड़ना चाहते हैं? –

+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

ठीक है, कौन सी आर संस्करण, जो सीआरएएन दर्पण, ...? – Roland

+0

आर 2.9.0, यूके (लंदन) – mb14

7

मैं यहां एक ही प्रश्न के साथ आया था। रोलैंड के जवाब के लिए धन्यवाद;

  • की अनुमति देता है महत्वपूर्ण आंकड़े निर्दिष्ट किया जा करने के लिए जब गोलाई = FALSE (सिर्फ 'signif' builtin समारोह की तरह से 6 चूक)
  • मूल्यों के साथ एक त्रुटि फेंक नहीं है: मैं कुछ परिवर्तनों के साथ अपने कोड पर बनाया गया ऊपर 1e27

आशा 1e-24

  • आउटपुट वैज्ञानिक संकेतन (कोई यूनिट) मूल्यों के लिए नीचे दिए गए इस उपयोगी है।

    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

    मैं हज़ार (कश्मीर), मिलियन (एम) और अरब (बी) संख्या कनवर्टर के लिए देख रहा था। मैंने इस रूटीन को आवश्यक आउटपुट आउट करने के लिए एक संख्यात्मक वेक्टर/एकल संख्या लेने के लिए संशोधित किया।

    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" 
    
    संबंधित मुद्दे