두 단어 문자열에서 두 단어의 첫 글자를 대문자로


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

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
그리고 이것이 다른 사람에게 도움이된다면, simpleCap 함수 안에 tolower 함수를 넣어서 모든 캡핑 된 단어도 처리 할 수 ​​있음을 기억하십시오 : <br/> name <-c ( "george wasHINgton", "tom jefferson ","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

3
@merose 맞지만이 경우에는 paste0 ()그렇지 않습니다. collapse = ...인수를 받아들이지 않기 때문에
Andrie

3
@ 앤드리는 여전히 맞습니까? 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
좋은 ppint-당신이 지금까지 얻을 수있는 타이틀 케이스 -ishst
petermeissner

감사! 이 솔루션은 미국 약어가있는 경우를 제외하고 대부분의 경우에 효과적입니다.
Tung

97

^공백 의 시작 또는 뒤에 시작 [[:space:]]하고 알파벳 문자가 오는 정규식을 일치 [[:alpha:]]시킵니다. 전역 적으로 (gsub의 g)는 이러한 모든 항목을 일치하는 시작 또는 공백 및 일치하는 알파벳 문자의 대문자 버전으로 바꿉니다 \\1\\U\\2. 이것은 펄 스타일 정규 표현식 일치로 수행해야합니다.

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

로 교체 인수에 대해 좀 더 구체적으로 gsub(), \\1'의 일부 사용 말한다 x즉, 부분 제 1 서브 표현 일치하는' x매칭 (^|[[:spacde:]]). 마찬가지로 두 번째 하위 표현식 \\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)
Chase

나는 이것을 행 이름에 사용하려고 시도했지만 한 번 작동했지만 반복 할 수 없었습니다.
dpel

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
스트링거 패키지 (정사각형이 당신의 것이라면)를 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


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

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)를 사용하는 것이 좋습니다. 또한 '모든 주요 단어'를 말하는 데 오류가있었습니다. 이 기능은 모든 단어에서 작동합니다 .
Cole Davis

또 다른 옵션 : library (Hmisc) # 대문자 기능
Cole Davis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.