小文字の文字列のベクトルがあります。タイトルケースに変更したいと思います。つまり、すべての単語の最初の文字が大文字になります。私は二重ループでそれを行うことができましたが、おそらくgsub
正規表現を使用したワンライナーなど、より効率的でエレガントな方法があることを願っています。
これは、機能する二重ループとともに、いくつかのサンプル データです。
strings = c("first phrase", "another phrase to convert",
"and here's another one", "last-one")
# For each string in the strings vector, find the position of each
# instance of a space followed by a letter
matches = gregexpr("\\b[a-z]+", strings)
# For each string in the strings vector, convert the first letter
# of each word to upper case
for (i in 1:length(strings)) {
# Extract the position of each regex match for the string in row i
# of the strings vector.
match.positions = matches[[i]][1:length(matches[[i]])]
# Convert the letter in each match position to upper case
for (j in 1:length(match.positions)) {
substr(strings[i], match.positions[j], match.positions[j]) =
toupper(substr(strings[i], match.positions[j], match.positions[j]))
}
}
これは機能しましたが、非常に複雑なようです。より単純なアプローチで失敗した実験の後でのみ、私はそれに頼りました。出力とともに、私が試したことのいくつかを次に示します。
# Google search suggested \\U might work, but evidently not in R
gsub("(\\b[a-z]+)", "\\U\\1" ,strings)
[1] "Ufirst Uphrase" "Uanother Uphrase Uto Uconvert"
[3] "Uand Uhere'Us Uanother Uone" "Ulast-Uone"
# I tried this on a lark, but to no avail
gsub("(\\b[a-z]+)", toupper("\\1"), strings)
[1] "first phrase" "another phrase to convert"
[3] "and here's another one" "last-one"
への呼び出しによって示されるように、正規表現は各文字列の正しい位置をキャプチャしますgregexpr
が、置換文字列は明らかに期待どおりに機能していません。
まだわからない場合は、私は正規表現に比較的慣れていないため、置換を正しく機能させる方法について助けていただければ幸いです。また、これらの文字の大文字と小文字を変更したくないため、アポストロフィの後に文字をキャプチャしないように正規表現を構造化する方法も学びたいと思います。