দুটি শব্দের স্ট্রিংয়ে উভয় শব্দের প্রথম অক্ষরকে মূলধন করুন


174

ধরা যাক যে আমার একটি দুটি শব্দের স্ট্রিং রয়েছে এবং আমি উভয়কেই মূলধন করতে চাই।

name <- c("zip code", "state", "final count")

Hmiscপ্যাকেজের মাধ্যমে একটি ফাংশন আছে capitalizeযা প্রথম শব্দ মূলধনী, কিন্তু আমি নিশ্চিত কিভাবে মূলধনী দ্বিতীয় শব্দ পেতে নই। সহায়তা পৃষ্ঠার capitalizeপরামর্শ দেয় না যে এটি সেই কাজটি সম্পাদন করতে পারে।

library(Hmisc)
capitalize(name)
# [1] "Zip code"    "State"       "Final count"

আমি পেতে চাই:

c("Zip Code", "State", "Final Count")

তিন-শব্দযুক্ত স্ট্রিং সম্পর্কে কী:

name2 <- c("I like pizza")

উত্তর:


172

মূলধন সম্পাদনের জন্য বেস আর ফাংশনটি toupper(x)। হেল্প ফাইল থেকে ?toupperএই ফাংশনটি রয়েছে যা আপনার যা প্রয়োজন তা করে:

simpleCap <- function(x) {
  s <- strsplit(x, " ")[[1]]
  paste(toupper(substring(s, 1,1)), substring(s, 2),
      sep="", collapse=" ")
}

name <- c("zip code", "state", "final count")

sapply(name, simpleCap)

     zip code         state   final count 
   "Zip Code"       "State" "Final Count" 

সম্পাদনা করুন এই কোন স্ট্রিং জন্য কাজ করে নির্বিশেষে শব্দ গণনা:

simpleCap("I like pizza a lot")
[1] "I Like Pizza A Lot"

11
এবং যদি এটি অন্যের পক্ষে সহায়ক হয় তবে মনে রাখবেন যে টোলভার ফাংশনটি আপনার অভ্যন্তরে সিম্পক্যাপ ফাংশনটি রেখে আপনি সমস্ত ক্যাপড শব্দেরও মোকাবেলা করতে পারেন: আপনি কোডটিই মোকাবেলা করতে পারেন: <br/> নাম <- সি ("জর্জি ওয়াশ হিন্টটন", "টম জেফারসন) "," এবি লিংকন ") সিম্পল ক্যাপ <ফাংশন (এক্স) <এস <- টোলভার (এক্স) এর <- স্টারস্প্লিট (গুলি," ") [[1]] পেস্ট (টপার (সাবস্ট্রিং (গুলি, 1,1)) , সাবস্ট্রিং (গুলি, 2), সেপ = "", ধস = "") pp সপ্লি (নাম, সরলক্যাপ)
ম্যাথিউআর

হাইফেনেটেড নামগুলি সম্পর্কে কীভাবে? স্মিথ-জোন্স বা আল-রেওনের মতো, যা স্মিথ-জোনস বা আল-রেয়ন হিসাবে প্রবেশ করতে পারে।
হ্যাক-আর

1
আপনি paste0()পরিবর্তে ব্যবহার করতে পারেন paste(..., sep="")। সহজভাবে খাটো।
মেরোস

3
@ ম্যারোজ সঠিক, তবে এই ক্ষেত্রে নয়, যেহেতু যুক্তিটি paste0 ()গ্রহণ করে নাcollapse = ...
অ্যান্ড্রি

3
@ এন্ড্রি এখনও কি সঠিক? paste0(c("a", "b"), collapse = ",")আমার জন্য ভাল কাজ করে। সম্ভবত এটি একটি সাম্প্রতিক বৈশিষ্ট্য?
মাইকেলচিরিকো

156

শিরোনাম কেসের জন্য বিল্ট -ইন বেস-আর সমাধানও রয়েছে:

tools::toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"

অথবা

library(tools)
toTitleCase("demonstrating the title case")
## [1] "Demonstrating the Title Case"

3
উত্সটি কিছুটা দেখার পরে বোঝা যায় যে ফাংশনটি ইংরেজী সম্ভবত ব্যতিক্রমের সংগ্রহ ব্যতীত (যেমন উদাহরণস্বরূপ c("all", "above", "after", "along", "also", "among", "any", "both", "can", "few", "it", "less", "log", "many", "may", "more", "over", "some", "their", "then", "this", "under", "until", "using", "von", "when", "where", "which", "will", "without", "yet", "you", "your")) বড় বড় অক্ষর দিয়ে সমস্ত শব্দ শুরু করার মাধ্যমে শিরোনাম কেস অর্জন করার চেষ্টা করে (যা মূল শব্দের সাথে সমস্ত শব্দ আরম্ভের চেয়ে অন্য কিছু )।
পিটারমিইসনার

15
আপনি যদি কেবলমাত্র প্রাথমিক চরিত্রটি মূলধন হিসাবে প্রত্যাশা করেন তবে আপনি অবাক হতে পারেন। tools::toTitleCase("HELLO")ফলাফল HELLO। আপনি tolowerপ্রথমে tools::toTitleCase(tolower("HELLO"))Hello
এটিকে গুটিয়ে রাখতে

2
ভাল পাইপিন্ট - এখনও এটি শিরোনাম-কেস-আপনি এখন পর্যন্ত পেতে পারেন
পিটারমিসনার

ধন্যবাদ! মার্কিন রাষ্ট্রগুলির সংক্ষিপ্ত
টুং

97

একটি নিয়মিত অভিব্যক্তি মেলে যা শুরুতে ^বা কোনও স্থানের পরে শুরু হয় [[:space:]]এবং তারপরে বর্ণানুক্রমিক চরিত্র [[:alpha:]]। বিশ্বব্যাপী (gsub in g) এই জাতীয় সমস্ত ঘটনাকে ম্যাচিং শুরু বা স্থান এবং মিলিত বর্ণানুক্রমিক চরিত্রের উপরের কেস সংস্করণের সাথে প্রতিস্থাপন করে \\1\\U\\2। পার্ল-স্টাইলের নিয়মিত এক্সপ্রেশন ম্যাচ দিয়ে এটি করতে হবে।

gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", name, perl=TRUE)
# [1] "Zip Code"    "State"       "Final Count"

থেকে প্রতিস্থাপন যুক্তি জন্য একটু আরো বিস্তারিত gsub(), \\1'এর অংশ ব্যবহার বলছেন x, অর্থাত্, অংশ প্রথম উপ-অভিব্যক্তি মিলে' xম্যাচিং (^|[[:spacde:]])। একইভাবে, দ্বিতীয় উপ-এক্সপ্রেশনটির \\2সাথে xমিলের অংশটি ব্যবহার করুন বলে ([[:alpha:]])\\Uসিনট্যাক্স ব্যবহার সক্ষম perl=TRUE, এবং পরবর্তী অক্ষরে উচ্চ-কেস করা মানে। সুতরাং "জিপ কোড" এর জন্য, \\1"জিপ", \\2"কোড", \\U\\2"কোড", এবং \\1\\U\\2"জিপ কোড"।

?regexpপৃষ্ঠা রেগুলার এক্সপ্রেশনের বুঝতে জন্য সহায়ক ?gsubজিনিস একসঙ্গে নির্বাণ জন্য।


12
বাঃ! আমি প্রথমে এই পথে নেমে গিয়েছিলাম, তবে \\uবুঝতে পারার আগে ভুল করে ব্যবহার করে ছেড়ে দিয়ে গিয়েছিলাম ... কিছুটা ব্যঙ্গাত্মক। বিজয়ের বলের মামলার বিরুদ্ধে পুরোপুরি পরীক্ষা করা নয়, এখানে আমি কী নিয়ে এসেছিgsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
চেজ

আমি এটি সারির নামগুলিতে ব্যবহার করার চেষ্টা করেছি এবং এটি একবার কাজ করেছে তবে আমি এটির পুনরাবৃত্তি করতে পারিনি।
dpel

tolower(name)অন্যান্য ক্যাপগুলি থাকলে তা নিয়ে কাজ করে
মাইকেলচিরিকো

83

stringiপ্যাকেজ থেকে এই ফাংশন ব্যবহার করুন

stri_trans_totitle(c("zip code", "state", "final count"))
## [1] "Zip Code"      "State"       "Final Count" 

stri_trans_totitle("i like pizza very much")
## [1] "I Like Pizza Very Much"

24
স্ট্রিংগার প্যাকেজ (যদি পরিশ্রম আপনার জিনিস হয়) stri_tans_totitleনামের একটি ফাংশনটিতে মোড়কে দেয় str_to_title()। এটি কেবল স্ট্রিং :: স্ট্রাইট_ট্রান্স_টোটিটল () কভারগুলির নীচে, তবে আপনার কর্মপ্রবাহের উপর নির্ভর করে অন্য লাইব্রেরি লোড করা সাশ্রয় করতে পারে (আপনি প্রকৃত পক্ষে ইতিমধ্যে লোড করতে পারেন)।
পাগলবিলি

50

বিকল্প:

library(stringr)
a = c("capitalise this", "and this")
a
[1] "capitalise this" "and this"       
str_to_title(a)
[1] "Capitalise This" "And This"   

স্ট্রিংর উত্তর জন্য প্রপস! ধন্যবাদ!
নিল বার্শ

21

চেষ্টা করুন:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})

দয়া করে মনে রাখবেন Hmiscওভাররাইট করা হতে পারে plyr'র summarizeফাংশন এখানে হিসাবে উল্লেখ করেছে: stackoverflow.com/a/35324305/288875
আন্দ্রে Holzner

2
@ আন্ড্রেহলজনার বা অন্যভাবে। Hmiscএর থেকে বেশ খানিকটা পুরানো plyr...
জরিস মেজ

16

এর জন্য সহায়তা পৃষ্ঠা থেকে ?toupper:

.simpleCap <- function(x) {
    s <- strsplit(x, " ")[[1]]
    paste(toupper(substring(s, 1,1)), substring(s, 2),
          sep="", collapse=" ")
}


> sapply(name, .simpleCap)

zip code         state   final count 
"Zip Code"       "State" "Final Count"

9

প্যাকেজটিতে BBmiscএখন ফাংশন রয়েছে capitalizeStrings

library("BBmisc")
capitalizeStrings(c("the taIl", "wags The dOg", "That Looks fuNny!")
    , all.words = TRUE, lower.back = TRUE)
[1] "The Tail"          "Wags The Dog"      "That Looks Funny!"

6

সাবস্ট্রিং এবং রেজেক্সপ্রের বিকল্প বিকল্প:

substring(name, 1) <- toupper(substring(name, 1, 1))
pos <- regexpr(" ", name, perl=TRUE) + 1
substring(name, pos) <- toupper(substring(name, pos, pos))

4

আপনি স্নেককেস প্যাকেজটি ব্যবহার করতে পারেন:

install.packages("snakecase")
library(snakecase)

name <- c("zip code", "state", "final count")
to_title_case(name)
#> [1] "Zip Code"    "State"       "Final Count"

# or 
to_upper_camel_case(name, sep_out = " ")
#> [1] "Zip Code"    "State"       "Final Count"

https://github.com/Tazinho/snakecase


2

এটি সমস্ত বড় শব্দকে মূলধন লেটার দেয়

library(lettercase)
xString = str_title_case(xString)

পুরোপুরি কাজ করে না> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
টুং

হ্যাঁ, আমি প্রথমে টোলভার (এক্স) ব্যবহার করার পরামর্শ দেব। এছাড়াও 'সমস্ত প্রধান শব্দ' বলতে আমি ত্রুটি করেছি; এই ফাংশন সব শব্দে কাজ করে ।
কোল ডেভিস

অন্য বিকল্প: লাইব্রেরি (এইচএমএস্ক) # মূলধন ফাংশন
কোল ডেভিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.