Coloque em maiúscula a primeira letra de ambas as palavras em uma sequência de duas palavras


174

Digamos que eu tenho uma sequência de duas palavras e quero colocar as duas em maiúsculas.

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

O Hmiscpacote tem uma função capitalizeque maiúscula a primeira palavra, mas não sei como obter a segunda palavra maiúscula. A página de ajuda para capitalizenão sugere que ele possa executar essa tarefa.

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

Eu quero obter:

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

E quanto a seqüências de três palavras:

name2 <- c("I like pizza")

Respostas:


172

A função R básica para realizar letras maiúsculas é toupper(x). No arquivo de ajuda, ?toupperexiste esta função que faz o que você precisa:

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" 

Editar Isso funciona para qualquer string, independentemente da contagem de palavras:

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

11
E se isso for útil para outros, lembre-se, colocando a função tolower dentro da função simpleCap, você também pode lidar com todas as palavras em maiúsculas: é o código que você pode lidar: <br/> name <- c ("george wasHINgton", "tom jefferson "," ABE LINCOLN ") simpleCap <- função (x) {s <- tolower (x) s <- strsplit (s," ") pasta [[1]] (toupper (substring (s, 1,1)) subcadeia, (s, 2), sep = "", colapso =" ")} sapply (nome, simpleCap)
MatthewR

E os nomes hifenizados? Como Smith-Jones ou Al-Rayon, que poderiam ser inseridos como SMITH-JONES ou al-rayon.
Hack-R

1
Você pode usar em paste0()vez de paste(..., sep=""). Simplesmente mais curto.
MERose

3
@merose correta, mas não neste caso, uma vez que paste0 ()não aceita o collapse = ...argumento
Andrie

3
@Andrie ainda está correto? paste0(c("a", "b"), collapse = ",")funciona bem para mim. Talvez este seja um recurso recente?
MichaelChirico

156

Também há uma solução base-R incorporada para maiúsculas e minúsculas:

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

ou

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

3
Tendo examinado um pouco a fonte, mostra que a função tenta obter letras maiúsculas (que é outra coisa que todas as palavras começam com maiúscula), permitindo que todas as palavras sejam maiúsculas, exceto uma coleção de exceções mais prováveis ​​em inglês (como por exemplo 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
Você pode se surpreender se espera APENAS que o caractere inicial seja capitalizado. tools::toTitleCase("HELLO")resulta em HELLO. Você pode querer quebrar esta em torno de tolowerprimeira, assim: tools::toTitleCase(tolower("HELLO"))que retornaHello
ddunn801

2
boa ppint - ainda seu o título-case-ISHST você pode chegar tão longe
petermeissner

Obrigado! Esta solução funciona muito bem na maioria dos casos, exceto quando há abreviações de estados dos EUA.
Tung

97

Corresponde a uma expressão regular que começa no início ^ou após um espaço [[:space:]]e é seguida por um caractere alfabético [[:alpha:]]. Globalmente (g em gsub) substitua todas essas ocorrências pelo início ou espaço correspondente e pela versão em maiúscula do caractere alfabético correspondente \\1\\U\\2. Isso deve ser feito com a correspondência de expressões regulares no estilo perl.

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

Um pouco mais detalhadamente para o argumento de substituição gsub(), \\1diz 'use a parte da xcorrespondência da primeira subexpressão', ou seja, a parte da xcorrespondência (^|[[:spacde:]]). Da mesma forma, \\2diz usar a parte da xcorrespondência da segunda subexpressão ([[:alpha:]]). A \\Usintaxe é ativada usando perl=TRUE, e significa tornar o próximo caractere em maiúscula. Portanto, para "CEP", \\1é "CEP", \\2é "código", \\U\\2é "Código" e \\1\\U\\2é "Código Postal".

A ?regexppágina é útil para entender expressões regulares, ?gsubpara organizar as coisas.


12
bah! Eu originalmente segui esse caminho, mas por engano estava usando \\ue desisti antes de perceber que eu deveria ter capitalizado isso ... um tanto irônico. Aqui está o que eu vim acima com, não completamente controlados contra um casos bola impargsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Perseguição

Tentei usar isso nos nomes das linhas e funcionou uma vez, mas não consegui repeti-lo.
dpel

Funciona tolower(name)se houver outros caps
MichaelChirico 6/06

83

Use esta função do stringipacote

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
O pacote stringr (se você gosta do tidyverse) envolve a stri_tans_totitlefunção nomeada str_to_title(). É apenas o stringi :: stri_trans_totitle () sob as capas, mas pode economizar o carregamento de outra biblioteca (que você pode, em essência, já ter carregado), dependendo do seu fluxo de trabalho.
crazybilly

50

Alternativo:

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

Adereços para a resposta stringr! Obrigado!
Neal Barsch 29/10/19


16

Na página de ajuda para ?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

O pacote BBmiscagora contém a função 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

Maneira alternativa com substring e regexpr:

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

4

Você também pode usar o pacote 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

Isso fornece letras maiúsculas para todas as principais palavras

library(lettercase)
xString = str_title_case(xString)

Não funciona perfeitamente> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

Sim, eu sugeriria o uso do tolower (x) primeiro. Também cometi um erro ao dizer 'todas as principais palavras'; Esta função funciona em todas as palavras.
Cole Davis

Outra opção: biblioteca (Hmisc) # capitalizar função
Cole Davis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.