दो शब्द स्ट्रिंग में दोनों शब्दों के पहले अक्षर को कैपिटलाइज़ करें


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

पूंजीकरण करने का आधार R कार्य है 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/> नाम <- c ("जॉर्ज वॉजहिनटन", "टॉम जेफरसन" "," ABE LINCOLN ") सिंपलकैप <- function (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] पेस्ट (टॉपर (प्रतिस्थापन (s, 1,1))) , प्रतिस्थापन (s, 2), sep = "", पतन = "")} sapply (नाम, simpleCap)
मैथ्यूआर

कैसे के बारे में hyphenated नाम? स्मिथ-जोन्स या अल-रेयॉन की तरह, जिसे SMITH-JONES या अल-रेयॉन के रूप में दर्ज किया जा सकता है।
हैक-आर

1
आप उपयोग कर सकते हैं paste0()के बजाय paste(..., sep="")। बस छोटा है।
मेरूस

3
@merose Correct, लेकिन इस मामले में नहीं, क्योंकि 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
ddunn801

2
अच्छा ppint - फिर भी इसका शीर्षक-मामला-जो आप अब तक प्राप्त कर सकते हैं
पीटरमैरनर

धन्यवाद! यह समाधान ज्यादातर मामलों के लिए बहुत अच्छा काम करता है, जब अमेरिकी राज्यों के संक्षिप्त विवरण हैं
तुंग

97

एक नियमित अभिव्यक्ति से मेल खाता है जो शुरुआत में ^या एक स्थान के बाद शुरू होता है [[:space:]]और उसके बाद एक वर्णमाला वर्ण होता है [[:alpha:]]। पूरी दुनिया में (gsub में छ), मिलान किया शुरुआत या अंतरिक्ष और मिलान किया वर्णमाला चरित्र के अपर-केस संस्करण के साथ इस तरह के सभी आवृत्तियां प्रतिस्थापित \\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
स्ट्रिंग पैकेज (यदि tidyverse आपकी चीज है) 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
@AndreHolzner या दूसरी तरह के आसपास। 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"


6

स्थानापन्न और regexpr के साथ वैकल्पिक तरीका:

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

4

आप snakecase पैकेज का उपयोग भी कर सकते हैं:

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"
टंग

हां, मैं पहले टोलवर (x) का उपयोग करने का सुझाव दूंगा। इसके अलावा मैंने 'सभी प्रमुख शब्द' कहने में त्रुटि की; यह फ़ंक्शन सभी शब्दों पर काम करता है ।
कोल डेविस

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