Gunakan huruf kapital untuk huruf pertama dari kedua kata dalam string dua kata


174

Katakanlah saya memiliki dua kata string dan saya ingin menggunakan keduanya.

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

The Hmiscpaket memiliki fungsi capitalizeyang dikapitalisasi kata pertama, tapi aku tidak yakin bagaimana untuk mendapatkan kata kedua dikapitalisasi. Halaman bantuan untuk capitalizetidak menyarankan bahwa ia dapat melakukan tugas itu.

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

Saya ingin mendapatkan:

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

Bagaimana dengan string tiga kata:

name2 <- c("I like pizza")

Jawaban:


172

Fungsi dasar R untuk melakukan kapitalisasi adalah toupper(x). Dari file bantuan untuk ?toupperada fungsi ini yang melakukan apa yang Anda butuhkan:

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" 

Sunting Ini berfungsi untuk sembarang string, terlepas dari jumlah kata:

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

11
Dan jika ini bermanfaat bagi orang lain, ingatlah dengan meletakkan fungsi tolower di dalam fungsi simpleCap, Anda juga dapat menangani semua kata yang dibatasi: adalah kode yang dapat digunakan: <br/> nama <- c ("george wasHINgton", "tom jefferson "," ABE LINCOLN ") simpleCap <- function (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] tempel (toupper (substring (s, 1,1)) , substring (s, 2), sep = "", collapse = "")} sapply (nama, simpleCap)
MatthewR

Bagaimana dengan nama yang ditulis dgn tanda penghubung? Seperti Smith-Jones atau Al-Rayon, yang bisa dimasukkan sebagai SMITH-JONES atau al-rayon.
Hack-R

1
Anda bisa menggunakan paste0()bukan paste(..., sep=""). Cukup pendek.
MEROSE

3
@merose Benar, tetapi tidak dalam kasus ini, karena paste0 ()tidak menerima collapse = ...argumen
Andrie

3
@ Andrie apakah itu masih benar? paste0(c("a", "b"), collapse = ",")bekerja dengan baik untuk saya. Mungkin ini fitur terbaru?
MichaelChirico

156

Ada solusi built-in base-R untuk case title juga:

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

atau

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

3
Setelah melihat ke sumbernya sedikit, itu menunjukkan bahwa fungsi mencoba untuk mencapai judul kasus (yang merupakan sesuatu yang lain dari semua kata dimulai dengan huruf kapital) dengan membiarkan memulai semua kata dengan huruf kapital kecuali kumpulan pengecualian bahasa Inggris yang paling mungkin (seperti misalnya 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
Anda mungkin akan terkejut jika Anda HANYA mengharapkan karakter awal dikapitalisasi. tools::toTitleCase("HELLO")hasil dalam HELLO. Anda mungkin ingin membungkus ini tolowerdulu, seperti itu: tools::toTitleCase(tolower("HELLO"))yang mengembalikanHello
ddunn801

2
Bagus ppint - masih dengan judul-kasus-ishst yang bisa Anda dapatkan sejauh ini
petermeissner

Terima kasih! Solusi ini bekerja sangat baik untuk sebagian besar kasus kecuali ketika ada singkatan dari negara bagian AS
Tung

97

Cocokkan ekspresi reguler yang dimulai pada awal ^atau setelah spasi [[:space:]]dan diikuti oleh karakter alfabet [[:alpha:]]. Secara global (g dalam gsub) mengganti semua kejadian seperti itu dengan awal atau ruang yang cocok dan versi huruf besar dari karakter alfabet yang cocok \\1\\U\\2,. Ini harus dilakukan dengan pencocokan ekspresi reguler gaya-perl.

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

Dalam sedikit lebih detail untuk argumen penggantian gsub(), \\1katakan 'gunakan bagian yang xcocok dengan sub-ekspresi pertama', yaitu bagian dari xpencocokan (^|[[:spacde:]]). Demikian juga, \\2kata gunakan bagian yang xcocok dengan sub-ekspresi kedua ([[:alpha:]]). The \\Usintaks diaktifkan dengan menggunakan perl=TRUE, dan sarana untuk membuat karakter berikutnya Atas kasus. Jadi untuk "Kode Pos", adalah "Kode Pos" \\1, \\2adalah "Kode", \\U\\2adalah "Kode", dan \\1\\U\\2"Kode Pos".

The ?regexphalaman membantu untuk memahami ekspresi reguler, ?gsubuntuk menempatkan sesuatu bersama-sama.


12
bah! Saya awalnya menempuh jalan ini, tetapi keliru menggunakan \\udan menyerah sebelum menyadari saya seharusnya memanfaatkannya ... agak ironis. Inilah yang saya buat, tidak diperiksa secara menyeluruh terhadap kotak bola yang anehgsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Chase

Saya mencoba menggunakan ini pada nama-nama baris dan berhasil sekali tetapi saya tidak bisa mengulanginya.
dpel

Bekerja tolower(name)jika ada topi lainnya
MichaelChirico

83

Gunakan fungsi ini dari stringipaket

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
Paket stringr (jika tidyverse adalah milik Anda) membungkus stri_tans_totitlefungsi tersebut dengan nama str_to_title(). Itu hanya stringi :: stri_trans_totitle () di bawah sampulnya, tetapi mungkin menghemat memuat pustaka lain (yang mungkin, pada dasarnya, sudah Anda muat), tergantung pada alur kerja Anda.
crazybilly

50

Alternatif:

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

Alat peraga untuk jawaban stringr! Terima kasih!
Neal Barsch


16

Dari halaman bantuan untuk ?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

Paket BBmiscsekarang berisi fungsi 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

Cara alternatif dengan substring dan regexpr:

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

4

Anda juga bisa menggunakan paket 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

Ini memberi Huruf kapital untuk semua kata-kata utama

library(lettercase)
xString = str_title_case(xString)

Tidak berfungsi dengan baik> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

Ya, saya sarankan menggunakan tolower (x) terlebih dahulu. Saya juga membuat kesalahan dalam mengatakan 'semua kata utama'; fungsi ini berfungsi pada semua kata.
Cole Davis

Pilihan lain: library (Hmisc) # capitalize function
Cole Davis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.