Viết hoa chữ cái đầu tiên của cả hai từ trong một chuỗi hai từ


174

Hãy nói rằng tôi có một chuỗi hai từ và tôi muốn viết hoa cả hai từ đó.

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

Các Hmiscgói có một chức năng capitalizemà vốn từ đầu tiên, nhưng tôi không chắc chắn làm thế nào để có được chữ thứ hai viết hoa. Trang trợ giúp capitalizekhông đề xuất rằng nó có thể thực hiện nhiệm vụ đó.

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

Tôi muốn có được:

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

Những gì về chuỗi ba từ:

name2 <- c("I like pizza")

Câu trả lời:


172

Hàm R cơ sở để thực hiện viết hoa là toupper(x). Từ tệp trợ giúp cho ?touppercó chức năng này thực hiện những gì bạn cần:

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" 

Chỉnh sửa Điều này hoạt động cho bất kỳ chuỗi, bất kể đếm từ:

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

11
Và nếu điều này hữu ích cho người khác, hãy nhớ bằng cách đặt hàm khoan dung bên trong hàm SimpleCap bạn cũng có thể xử lý tất cả các từ được giới hạn: mã bạn có thể xử lý: <br/> tên <- c ("george wasHINgton", "tom jefferson "," ABE LINCOLN ") SimpleCap <- function (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] dán (toupper (chuỗi con (s, 1,1)) , chuỗi con (s, 2), sep = "", sụp đổ = "")} sapply (tên, SimpleCap)
MatthewR

Làm thế nào về tên gạch nối? Giống như Smith-Jones hoặc Al-Rayon, có thể được nhập dưới dạng SMITH-JONES hoặc al-rayon.
Hack-R

1
Bạn có thể sử dụng paste0()thay vì paste(..., sep=""). Đơn giản là ngắn hơn.
MERose

3
@merose Đúng, nhưng không phải trong trường hợp này, vì paste0 ()không chấp nhận collapse = ...đối số
Andrie

3
@Andrie có còn đúng không? paste0(c("a", "b"), collapse = ",")làm việc tốt cho tôi Có lẽ đây là một tính năng gần đây?
MichaelChirico

156

Cũng có một giải pháp cơ sở R tích hợp cho trường hợp tiêu đề:

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

hoặc là

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

3
Nhìn vào nguồn một chút, nó cho thấy hàm cố gắng đạt được trường hợp tiêu đề (đó là một cái gì đó khác với tất cả các từ bắt đầu bằng chữ in hoa) bằng cách bắt đầu tất cả các từ bằng chữ in hoa trừ một bộ sưu tập các ngoại lệ có khả năng tiếng Anh nhất (ví dụ như 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
Bạn có thể ngạc nhiên nếu bạn mong đợi CHỈ ký tự đầu tiên được viết hoa. tools::toTitleCase("HELLO")kết quả trong HELLO. Bạn có thể muốn bọc cái này tolowertrước, vì vậy: tools::toTitleCase(tolower("HELLO"))trả vềHello
ddunn801

2
ppint tốt - vẫn là trường hợp tiêu đề của bạn cho đến nay
petermeissner

Cảm ơn! Giải pháp này hoạt động tốt cho hầu hết các trường hợp trừ khi có chữ viết tắt của các tiểu bang Hoa Kỳ
Tung

97

Khớp một biểu thức chính quy bắt đầu từ đầu ^hoặc sau dấu cách [[:space:]]và được theo sau bởi một ký tự chữ cái [[:alpha:]]. Trên toàn cầu (g trong gsub) thay thế tất cả các lần xuất hiện như vậy bằng phần bắt đầu hoặc dấu cách trùng khớp và phiên bản chữ hoa của ký tự chữ cái phù hợp , \\1\\U\\2. Điều này phải được thực hiện với kết hợp biểu thức chính quy theo kiểu perl.

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

Chi tiết hơn một chút cho đối số thay thế thành gsub(), \\1nói 'sử dụng phần xkhớp với biểu thức phụ đầu tiên', nghĩa là phần xkhớp (^|[[:spacde:]]). Tương tự, \\2nói sử dụng phần xkhớp với biểu thức con thứ hai ([[:alpha:]]). Các \\Ulà cú pháp kích hoạt bằng cách sử dụng perl=TRUE, và phương tiện để làm cho nhân vật tiếp theo Upper hợp cụ thể. Vì vậy, đối với "Mã Zip", \\1là "Zip", \\2là "mã", \\U\\2là "Mã" và \\1\\U\\2là "Mã Zip".

Các ?regexptrang là hữu ích trong việc tìm hiểu biểu thức thông thường, ?gsubcho đưa mọi thứ trở lại với nhau.


12
bah Ban đầu tôi đã đi theo con đường này, nhưng đã sử dụng nhầm \\uvà bỏ cuộc trước khi nhận ra rằng tôi nên viết hoa nó ... hơi mỉa mai. Đây là những gì tôi nghĩ ra, không được xem xét kỹ lưỡng về một trường hợp bóng kỳ quặcgsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Đuổi theo

Tôi đã thử sử dụng tên này trên tên hàng và nó đã hoạt động một lần nhưng tôi không thể lặp lại.
dpel

Hoạt động tolower(name)nếu có mũ khác
MichaelChirico 6/10/2016

83

Sử dụng chức năng này từ stringigói

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
Gói Stringr (nếu tidyverse là thứ của bạn) kết hợp stri_tans_totitlethành một hàm có tên str_to_title(). Đó chỉ là chuỗi Stringi :: stri_trans_totitle () dưới bìa, nhưng có thể lưu tải một thư viện khác (về bản chất, bạn có thể đã tải), tùy thuộc vào quy trình làm việc của bạn.
crazybilly

50

Thay thế:

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

Đạo cụ cho câu trả lời Stringr! Cảm ơn!
Neal Barsch

21

Thử:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})

lưu ý rằng Hmisccó thể ghi đè chức năng plyrcủa summarizenó như được đề cập ở đây: stackoverflow.com/a353324305/288875
Andre Holzner

2
@AndreHolzner Hoặc cách khác. Hmisclớn hơn một chút so với plyr...
Joris Meys

16

Từ trang trợ giúp cho ?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

Các gói BBmiscbây giờ có chức năng 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

Cách khác với chuỗi con và regexpr:

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

4

Bạn cũng có thể sử dụng gói 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

Điều này cung cấp chữ in hoa cho tất cả các từ chính

library(lettercase)
xString = str_title_case(xString)

Không hoạt động hoàn hảo> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

Có, tôi sẽ đề nghị sử dụng tolower (x) trước. Ngoài ra tôi đã mắc lỗi khi nói 'tất cả các từ chính'; chức năng này hoạt động trên tất cả các từ.
Cole Davis

Một tùy chọn khác: thư viện (Hmisc) # viết hoa chức năng
Cole Davis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.