Велика літера з обох слів складається з двох слів


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
І якщо це корисно іншим, пам’ятайте, що, ввівши функцію толоуер у вашій функції simpleCap, ви можете мати справу і з усіма обмеженими словами: це код, з яким ви можете мати справу: <br/> name <- c ("Джордж wasHINgton", "Том Джефферсон" "," ABE LINCOLN ") simpleCap <- функція (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] paste (toupper (substring (s, 1,1)) , substring (s, 2), sep = "", колапс = "")} sapply (ім'я, simpleCap)
MatthewR

Як щодо дефісів? Як Сміт-Джонс або Аль-Рейон, які можна було б ввести як СМІТ-ЖОНС або аль-район.
Hack-R

1
Ви можете використовувати paste0()замість paste(..., sep=""). Просто коротше.
MERose

3
@merose Правильно, але не в цьому випадку, оскільки paste0 ()не приймає collapse = ...аргумент
Андрі

3
@Andrie це все-таки правильно? paste0(c("a", "b"), collapse = ",")добре працює для мене. Можливо, це нещодавня особливість?
MichaelChirico

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
хороший пінт - все-таки його найголовніший випадок ви можете отримати поки що
petermeissner

Дякую! Це рішення чудово підходить для більшості випадків, за винятком випадків, коли є скорочення штатів США
Тун

97

Зіставити регулярний вираз, який починається на початку ^або після пробілу [[:space:]]і супроводжується алфавітним символом [[:alpha:]]. У світовому масштабі (Г в GSUB) замінити всі такі випадки з відповідністю початку або простору , і версії верхнього регістру узгодженої букви алфавіту, \\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каже, використовуйте частину 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)
Чейз

Я намагався використовувати це у назвах рядків, і це спрацювало один раз, але я не зміг його повторити.
квітня 1616

Працює над тим, 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
Пакет stringr (якщо 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"   

Реквізит для відповіді стрингера! Дякую!
Ніл Барш


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

Альтернативний спосіб з підрядкою та regexpr:

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

Так, я б запропонував спочатку використовувати толовер (x). Також я помилився, сказавши «всі основні слова»; ця функція працює на всі слова.
Коул Девіс,

Ще один варіант: бібліотека (Hmisc) # функція з великої літери
Коул Девіс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.