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")
ATMathew
fonte

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"
Andrie
fonte
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"
petermeissner
fonte
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.

Martin Morgan
fonte
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"
bartektartanus
fonte
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"   
Brijesh
fonte
Adereços para a resposta stringr! Obrigado!
Neal Barsch 29/10/19
21

Experimentar:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
diliop
fonte
nota que Hmiscpodem substituir plyr's summarizefunção como mencionado aqui: stackoverflow.com/a/35324305/288875
Andre Holzner
2
@AndreHolzner Ou o contrário. Hmiscé um pouco mais velho do que plyr...
Joris Meys
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"
correr atrás
fonte
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!"
Dirk
fonte
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))
greg L
fonte
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

Taz
fonte
2

Isso fornece letras maiúsculas para todas as principais palavras

library(lettercase)
xString = str_title_case(xString)
Cole Davis
fonte
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