अग्रणी शून्य कैसे जोड़ें?


352

मेरे पास डेटा का एक सेट है जो कुछ इस तरह दिखता है:

anim <- c(25499,25500,25501,25502,25503,25504)
sex  <- c(1,2,2,1,2,1)
wt   <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)

data
   anim sex  wt anim2
1 25499   1 0.8     2
2 25500   2 1.2     2
3 25501   2 1.0     2
4 25502   1 2.0     2
5 25503   2 1.8     2
6 25504   1 1.4     2

मैं प्रत्येक पशु आईडी से पहले एक शून्य जोड़ना चाहूंगा:

data
   anim sex  wt anim2
1 025499   1 0.8     2
2 025500   2 1.2     2
3 025501   2 1.0     2
4 025502   1 2.0     2
5 025503   2 1.8     2
6 025504   1 1.4     2

और ब्याज के लिए, क्या होगा अगर मुझे जानवरों की आईडी से पहले दो या तीन शून्य जोड़ने की आवश्यकता है?


6
मान लें कि आप जानवरों की आईडी से पहले n शून्य जोड़ना चाहते हैं, तो आपको बस करना होगाdata$anim = paste(rep(0, n), data$anim, sep = "")
रामनाथ

2
जब आप कहते हैं कि आप "शून्य जोड़ना चाहते हैं", तो आप संभवतः अपने पूर्णांक स्तंभों को स्ट्रिंग / श्रेणीबद्ध में परिवर्तित नहीं करना चाहते हैं ताकि डेटा के भीतर शून्य-पैडिंग को जोड़ा जा सके, आप उन्हें पूर्णांक रखना चाहते हैं और केवल अग्रणी शून्य प्रिंट करते हैं। जब आउटपुट प्रस्तुत करना
1

जवाबों:


555

संक्षिप्त संस्करण: उपयोग formatCया sprintf


अब संस्करण:

संख्याओं को स्वरूपित करने के लिए कई कार्य उपलब्ध हैं, जिनमें प्रमुख शून्य जोड़ना शामिल हैं। कौन सा सबसे अच्छा इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं।

प्रश्न से उदाहरण काफी आसान है क्योंकि सभी मानों को अंकों की एक ही संख्या के साथ शुरू करना है, तो चलिए 10 चौड़ाई 8 की शक्तियां बनाने का कठिन उदाहरण आजमाते हैं।

anim <- 25499:25504
x <- 10 ^ (0:5)

paste(और यह भिन्न है paste0) अक्सर पहले स्ट्रिंग हेरफेर फ़ंक्शन होते हैं जो आप भर में आते हैं। वे वास्तव में संख्याओं में हेरफेर करने के लिए डिज़ाइन नहीं किए गए हैं, लेकिन उनका उपयोग इसके लिए किया जा सकता है। साधारण मामले में, जहां हमें हमेशा एक ही शून्य को रोकना होता paste0है, सबसे अच्छा समाधान है।

paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

उस मामले के लिए जहां अंकों में एक चर संख्या होती है, आपको मैन्युअल रूप से गणना करने के लिए कितने शून्य की गणना करनी होगी, जो कि इतनी भयानक है कि आपको केवल रुग्ण जिज्ञासा से बाहर करना चाहिए।


str_padstringrइसी तरह से काम करता है paste, जिससे यह स्पष्ट हो जाता है कि आप चीजों को पैड करना चाहते हैं।

library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

फिर, यह वास्तव में संख्याओं के साथ उपयोग के लिए डिज़ाइन नहीं किया गया है, इसलिए कठिन मामले के बारे में थोड़ा सोचने की आवश्यकता है। हमें केवल "जीरो के साथ पैड की चौड़ाई 8" कहने में सक्षम होना चाहिए, लेकिन इस आउटपुट को देखें:

str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"

आपको वैज्ञानिक दंड विकल्प को सेट करने की आवश्यकता है ताकि संख्या को हमेशा निश्चित संकेतन (वैज्ञानिक संकेतन के बजाय) का उपयोग करके स्वरूपित किया जाए।

library(withr)
with_options(
  c(scipen = 999), 
  str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

stri_padमें stringiवास्तव में की तरह काम करता है str_padसे stringr


formatCC फ़ंक्शन का इंटरफ़ेस है printf। इसका उपयोग करने के लिए उस अंतर्निहित फ़ंक्शन के आर्कन के कुछ ज्ञान की आवश्यकता होती है (लिंक देखें)। इस मामले में, महत्वपूर्ण बिंदुओं हैं widthतर्क, formatकिया जा रहा है "d"एक "पूर्णांक" के लिए, और "0" flagprepending शून्यों के लिए।

formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

यह मेरा पसंदीदा समाधान है, क्योंकि यह चौड़ाई बदलने के साथ टिंकर करना आसान है, और फ़ंक्शन अन्य स्वरूपण परिवर्तन करने के लिए पर्याप्त शक्तिशाली है।


sprintfउसी नाम के C फ़ंक्शन का इंटरफ़ेस है; की तरह formatCहै लेकिन एक अलग वाक्य रचना के साथ।

sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

इसका मुख्य लाभ sprintfयह है कि आप पाठ के लंबे बिट्स के अंदर स्वरूपित संख्याओं को एम्बेड कर सकते हैं।

sprintf(
  "Animal ID %06d was a %s.", 
  anim, 
  sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion."  "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion." 

अच्छा जवाब भी देखिए


पूर्णता के लिए यह अन्य स्वरूपण कार्यों का उल्लेख करने के लायक है जो कभी-कभी उपयोगी होते हैं, लेकिन ज़ीरो को प्रस्तुत करने का कोई तरीका नहीं है।

format, संख्याओं के लिए एक विधि के साथ किसी भी प्रकार की वस्तु को प्रारूपित करने के लिए एक सामान्य कार्य। यह थोड़ा सा काम करता है formatC, लेकिन अभी तक एक और इंटरफ़ेस के साथ।

prettyNumअभी तक एक और स्वरूपण समारोह है, ज्यादातर मैनुअल अक्ष टिक लेबल बनाने के लिए। यह विशेष रूप से संख्याओं की विस्तृत श्रृंखला के लिए काम करता है।

scalesपैकेज जैसे कई कार्य करता है percent, date_formatऔर dollarविशेषज्ञ प्रारूप प्रकार के लिए।


3
बहुत मदद के लिए बहुत बहुत धन्यवाद। मैंने अपने एनिमेशन में अग्रणी शून्य जोड़ने के लिए formatC का उपयोग किया और यह अच्छी तरह से काम किया।
बाज़

2
formatC (संख्या या वेक्टर, चौड़ाई = 6, स्वरूप = "d", ध्वज = "0") ने अच्छी तरह से काम किया (आर संस्करण 3.0.2 (2013-09-25))। धन्यवाद।
मोहम्मद फकीह

1
ऊपर वर्णित तरीके से formatC () का उपयोग करना मेरे लिए कारगर नहीं रहा। इसमें शून्य के बजाय रिक्त स्थान जोड़े गए। क्या मैंने कुछ गलत किया? मैं 3.1.1 संस्करण का उपयोग कर रहा हूँ।
user1816679

2
@ user1816679 लगता है कि आप भूल गए flag = "0"
रिची कॉटन

1
?sprintfसहायता पृष्ठ का विवरण अनुभाग इसका वर्णन करता है। "एमएन: क्षेत्र की चौड़ाई (एम) और सटीक (एन) को दर्शाते हुए एक अवधि द्वारा अलग किए गए दो नंबर।"
रिची कॉटन

215

एक सामान्य समाधान के लिए, जो कि कितने अंकों में है data$anim, sprintfकार्य करता है , फ़ंक्शन का उपयोग करें । यह इस तरह काम करता है:

sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"

आपके मामले में, आप शायद चाहते हैं: data$anim <- sprintf("%06d", data$anim)


14
ध्यान दें कि sprintfसंख्यात्मक को स्ट्रिंग (वर्ण) में कनवर्ट करता है।
aL3xa

जवाब के लिए धन्यवाद। मैं 13 अंकों की संख्या को 14 अंकों (शून्य को जोड़ते हुए) बनाना चाहता हूं। यह फ़ंक्शन इस मामले के लिए काम नहीं करता है। यह मुझे एक एंकर देता है: स्प्रिंटफ में त्रुटि ("% 020d", 4000100000104): अमान्य प्रारूप '% 020d'; संख्यात्मक वस्तुओं के लिए प्रारूप% f,% e,% g या% का उपयोग करें। कोई उपाय?
रोटेल

कोशिश करें: स्प्रिंटफ़ ("% 014.0f", 4000100000104)
स्टीवर्ट मैकडोनाल्ड

स्प्रिंटफ R 3.4.1 के लिए उपलब्ध नहीं है
फ्रैंक FYC

हाँ यही है। यह संस्करण 1.5.0 के बाद से अपरिवर्तित है।
डैश 2

33

@ गुडसाइड के रिप्सन पर विस्तार:

कुछ मामलों में आप शून्य के साथ एक स्ट्रिंग पैड करना चाहते हैं (उदाहरण के लिए ज़िप कोड या अन्य संख्यात्मक जैसे कारक)। OSX / Linux में:

> sprintf("%05s", "104")
[1] "00104"

लेकिन क्योंकि sprintf()OS के C sprintf()कमांड को कॉल किया जाता है , यहाँ पर चर्चा की गई , विंडोज 7 में आपको एक अलग परिणाम मिलता है:

> sprintf("%05s", "104")
[1] "  104"

विंडोज मशीनों पर काम के आसपास है:

> sprintf("%05d", as.numeric("104"))
[1] "00104"

1
जो भी कारण के लिए, यह समाधान अब लिनक्स पर मेरे लिए काम नहीं करता है। @ कदौरिया str_padअब मेरा जाना है।
मेटासेकिया

25

str_padसे stringrपैकेज एक विकल्प है।

anim = 25499:25504
str_pad(anim, width=6, pad="0")

4
str_padइसके साथ बहुत सावधान रहें क्योंकि यह अप्रत्याशित परिणाम दे सकता है। i.num = 600000; str_pad(i.num, width = 7, pad = "0") आपको "006e + 05" देगा और "0600000" नहीं
पंकिल शाह

2

यहाँ एक सामान्य आधार आर फ़ंक्शन है:

pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){

    unlist(lapply(x, function(x) {
        paste0(
            paste(rep(char, len - nchar(x)), collapse = ''),
            x
        )
    }))
}

pad_left(1:100)

मुझे पसंद है sprintfलेकिन यह कैविटीज़ के साथ आता है जैसे:

हालाँकि वास्तविक कार्यान्वयन C99 मानक का पालन करेगा और ठीक विवरण (विशेषकर उपयोगकर्ता त्रुटि के तहत व्यवहार) मंच पर निर्भर हो सकता है


1

यहाँ CUSIP के रूप में स्ट्रिंग के लिए 0s को जोड़ने के लिए एक और विकल्प है जो कभी-कभी एक संख्या की तरह दिख सकता है और जो कि कई एप्लिकेशन जैसे कि Excel भ्रष्ट होगा और अग्रणी 0s को हटा देगा या उन्हें वैज्ञानिक संकेतन में बदल देगा।

जब मैंने @metasequoia द्वारा प्रदान किए गए उत्तर की कोशिश की तो वेक्टर में प्रमुख स्थान थे और 0एस नहीं । यह एक ही समस्या @ user1816679 ने उल्लेख किया था - और चारों ओर उद्धरण चिह्न निकाल कर 0या से बदल रहा है %dकरने के लिए %sया तो एक फर्क नहीं किया। FYI करें, मैं एक Ubuntu सर्वर पर चलने वाले RStudio सर्वर का उपयोग कर रहा हूं। इस छोटे से दो-चरण समाधान ने मेरे लिए काम किया:

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

पैकेज %>%से पाइप फ़ंक्शन का उपयोग करना magrittrइस तरह दिख सकता है:

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

मैं एक-फ़ंक्शन समाधान पसंद करूंगा, लेकिन यह काम करता है।



0

अन्य परिस्थितियों के लिए जिसमें आप संख्या स्ट्रिंग के अनुरूप होना चाहते हैं, मैंने एक फ़ंक्शन बनाया।

किसी को यह उपयोगी लग सकता है:

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

स्वरूपण के बारे में क्षमा करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.