2つの単語の文字列で両方の単語の最初の文字を大文字にします


174

2つの単語の文字列があり、両方を大文字にしたいとします。

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

Hmiscパッケージには、機能を有するcapitalize最初の単語を大文字に、私は大文字で2番目の単語を取得するかどうかはわかりません。のヘルプページcapitalizeは、そのタスクを実行できることを示唆していません。

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

私は手に入れたい:

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

3ワードの文字列についてはどうですか?

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
そして、これが他の人に役立つ場合は、tolower関数をsimpleCap関数内に置くことで、すべての制限された単語も処理できることを覚えておいてください。処理できるコードは次のとおりです。 "、" ABE LINCOLN ")simpleCap <-function(x){s <-tolower(x)s <-strsplit(s、" ")[[1]] paste(toupper(substring(s、1,1)) 、substring(s、2)、sep = ""、collapse = "")} sapply(name、simpleCap)
MatthewR

ハイフネーションされた名前はどうですか?Smith-JonesまたはAl-Rayonのように、SMITH-JONESまたはal-rayonとして入力できます。
Hack-R

1
paste0()代わりに使用できますpaste(..., sep="")。単に短くなります。
MERose 2015

3
@merose正解ですが、この場合はそうではありpaste0 ()ません。collapse = ...引数を受け入れないためです
Andrie

3
@Andrieはまだ正しいですか?paste0(c("a", "b"), collapse = ",")私にとってはうまくいきます。おそらくこれは最近の機能ですか?
MichaelChirico 2016年

156

ビルドでありベース-Rソリューションタイトルケースのためにもは:

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")
petermeissner

15
最初の文字だけを大文字にすることを期待している場合は、驚くかもしれません。 tools::toTitleCase("HELLO")結果はHELLOです。tolower次のように、これを最初にラップすることをお勧めしtools::toTitleCase(tolower("HELLO"))ます。これは、次を返しますHello
ddunn801

2
良いppint-それでも、これまでに得ることができるタイトルケースのようなものです
petermeissner 2017

ありがとう!このソリューションは、米国の州の略語がある場合を除いて、ほとんどの場合に
Tung

97

先頭^またはスペースの後に始まり、その後に[[:space:]]英字が続く正規表現に一致し[[:alpha:]]ます。グローバルに(gsubのg)は、そのようなすべての出現箇所を、一致する先頭またはスペースと、一致するアルファベット文字の大文字バージョンで置き換えます\\1\\U\\2。これは、perlスタイルの正規表現マッチングで行う必要があります。

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

交換引数のもう少し詳細にはgsub()\\1「一部の使用言いx、すなわち、最初のサブ表現にマッチする」の部分x一致(^|[[:spacde:]])。同様に、2番目の部分式\\2x一致する部分を使用すると言います([[: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 2016

上の作品tolower(name)、他のキャップがある場合
MichaelChirico

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()。それは単なるstringi :: stri_trans_totitle()ですが、ワークフローによっては、別のライブラリ(本質的には既にロードされている可能性があります)のロードを節約できる場合があります。
crazybilly

50

代替:

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

ささら桁の答えの小道具!ありがとう!
Neal Barsch

21

試してください:

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

ここで言及されているようにの関数をHmiscオーバーライドする可能性があることに注意してください:stackoverflow.com/a/35324305/288875plyrsummarize
Andre Holzner

2
@AndreHolznerまたはその逆。... Hmiscよりかなり古いplyr
Joris Meys

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

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"
Tung

はい、最初にtolower(x)を使用することをお勧めします。また、私は「すべての主要な単語」と言って間違えました。この関数はすべての単語で機能ます。
コールデイビス

別のオプション:library(Hmisc)#資本化関数
Cole Davis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.