কীভাবে নেতৃস্থানীয় জিরো যুক্ত করবেন?


351

আমার কাছে ডেটার একটি সেট রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:

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
মনে করুন আপনি পশুর আইডির আগে এন জিরো যুক্ত করতে চান আপনার কেবলমাত্রdata$anim = paste(rep(0, n), data$anim, sep = "")
রামনাথ

2
আপনি যখন বলেন যে আপনি "শূন্যগুলি যুক্ত করতে চান", আপনি সম্ভবত ডেটার ভিতরে শূন্য-প্যাডিং যুক্ত করতে আপনার পূর্ণসংখ্যা কলামগুলি স্ট্রিং / শ্রেণিবিন্যাসে রূপান্তর করতে চান না, আপনি তাদের পূর্ণসংখ্যায় রাখতে চান এবং কেবল শীর্ষস্থানীয় শূন্যগুলি মুদ্রণ করতে চান আউটপুট রেন্ডার করার সময়
স্মি

উত্তর:


552

সংক্ষিপ্ত সংস্করণ: ব্যবহার 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_padথেকে stringrঅনুরূপভাবে কাজ করে 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


formatCসি ফাংশন একটি ইন্টারফেস printf। এটি ব্যবহারের জন্য অন্তর্নিহিত ফাংশনের আরকানা সম্পর্কে কিছু জ্ঞানের প্রয়োজন (লিঙ্কটি দেখুন)। এই ক্ষেত্রে, গুরুত্বপূর্ণ বিষয়গুলি হ'ল widthযুক্তি, "পূর্ণসংখ্যার" জন্য এবং একটি জিরো প্রিপেন্ডিংয়ের জন্য।format"d""0" flag

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একই নামের সি ফাংশনের ইন্টারফেস; মত 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." 

আরও দেখুন goodside এর উত্তর


সম্পূর্ণতার জন্য এটি অন্যান্য ফর্ম্যাটিং ফাংশনগুলি উল্লেখ করা উচিত যা মাঝে মধ্যে দরকারী, তবে শূন্যগুলি প্রিপেন্ডিংয়ের কোনও পদ্ধতি নেই।

format, সংখ্যার পদ্ধতি সহ যেকোন ধরণের অবজেক্টকে ফর্ম্যাট করার জন্য একটি জেনেরিক ফাংশন। এটি সামান্য বিট কাজ formatCকরে তবে অন্য ইন্টারফেসের সাথে।

prettyNumবেশিরভাগ ম্যানুয়াল অক্ষ টিক লেবেল তৈরি করার জন্য এটি এখনও অন্য ফর্ম্যাটিং ফাংশন। এটি সংখ্যা বিস্তৃত জন্য বিশেষত ভাল কাজ করে।

scalesপ্যাকেজ যেমন বিভিন্ন ফাংশন আছে percent, date_formatএবং dollarবিশেষজ্ঞ বিন্যাস ধরনের জন্য।


3
মহান সাহায্যের জন্য অনেক ধন্যবাদ। আমি আমার এনিমগুলিতে নেতৃস্থানীয় শূন্যগুলি যুক্ত করতে ফর্ম্যাটসি ব্যবহার করেছি এবং এটি ভালভাবে কাজ করেছে।
বাজ

2
formatC (সংখ্যা বা ভেক্টর, প্রস্থ = 6, ফর্ম্যাট = "ডি", পতাকা = "0") ভাল কাজ করেছে (আর সংস্করণ 3.0.2 (2013-09-25))। ধন্যবাদ।
মোহামাদ ফকিহ

1
উপরে বর্ণিত পদ্ধতিতে ফরম্যাটসি () ব্যবহার করা আমার পক্ষে কার্যকর হয়নি। এটি শূন্যের পরিবর্তে ফাঁকা স্থান যুক্ত করেছে। আমি কি কিছু ভুল করবেন? আমি আর সংস্করণটি ব্যবহার করছি 3.1.1।
ব্যবহারকারী 1816679

2
@ ব্যবহারকারী 1816679 আপনার মত ভুলে গেছে 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-অঙ্কগুলিতে করতে চাই (শূন্যের শুরুর যোগ)। এই ফাংশনটি এই ক্ষেত্রে কাজ করে না বলে মনে হচ্ছে। এটি আমাকে একটি ত্রুটি দেয়: স্প্রিন্টফে ত্রুটি ("% 020 ডি", 4000100000104): অবৈধ ফর্ম্যাট '% 020 ডি'; সংখ্যাযুক্ত অবজেক্টের জন্য% f,% e,% g বা% a ফর্ম্যাট ব্যবহার করুন। যেকোনো পরামর্শ?
রোটাইল

চেষ্টা করুন: স্প্রিন্টফ ("% 014.0f", 4000100000104)
স্টিয়ার্ট ম্যাকডোনাল্ড


হ্যাঁ তাই হয়। এটি 1.5.0 সংস্করণ থেকে অপরিবর্তিত রয়েছে।
ড্যাশ 2

32

@ গুডসাইডের রেসপন্সে সম্প্রসারণ করা:

কিছু ক্ষেত্রে আপনি জিরো (উদাহরণস্বরূপ ফিপস কোড বা অন্যান্য সংখ্যার মতো উপাদান) দিয়ে একটি স্ট্রিং প্যাড করতে চাইতে পারেন। ওএসএক্স / লিনাক্সে:

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

কিন্তু কারণ sprintf()কল ওএস এর সি sprintf()কমান্ড আলোচনা এখানে , উইন্ডোস 7 এ আপনি কি অন্য কিছু ফলাফলের পাবেন:

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

সুতরাং উইন্ডোজ মেশিনে চারপাশের কাজটি হ'ল:

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

1
যে কারণেই হোক না কেন, এই সমাধানটি আমার পক্ষে লিনাক্সে আর কাজ করে না। @ কেডরিয়া str_padএখন আমার কাছে যাচ্ছেন।
মেটাসেকোয়া

25

str_padstringrপ্যাকেজ থেকে একটি বিকল্প।

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তবে এটি সাবধানতার সাথে আসে:

তবে প্রকৃত বাস্তবায়ন সি 99 স্ট্যান্ডার্ড এবং সূক্ষ্ম বিবরণ অনুসরণ করবে (বিশেষত ব্যবহারকারীর ত্রুটির সাথে আচরণ) প্ল্যাটফর্মের উপর নির্ভর করতে পারে


1

এখানে CsIP এর মতো স্ট্রিংগুলিতে 0 টি যুক্ত করার আরও একটি বিকল্প রয়েছে যা কখনও কখনও সংখ্যার মতো দেখতে পারে এবং এক্সেলের মতো অনেক অ্যাপ্লিকেশন নেতৃস্থানীয় 0 গুলি সরিয়ে ফেলবে বা বৈজ্ঞানিক স্বরলিপিতে রূপান্তর করবে।

আমি যখন @ মেটাসেকোইয়া সরবরাহিত উত্তরটি চেষ্টা করলাম তখন ভেক্টর ফিরে আসার সাথে সাথে শীর্ষস্থানীয় স্থান ছিল এবং এটি নয় 0। এই একই সমস্যা @ user1816679 উল্লেখ ছিল - এবং প্রায় কোট সরানোর 0বা থেকে পরিবর্তন %dকরতে %sপারেন একটি পার্থক্য করতে হয়নি। এফওয়াইআই, আমি একটি উবুন্টু সার্ভারে চলমান আরস্টুডিও সার্ভার ব্যবহার করছি। এই সামান্য দ্বি-পদক্ষেপ সমাধান আমার পক্ষে কাজ করেছে:

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)

বিন্যাস সম্পর্কে দুঃখিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.