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

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

Martin Morgan
sumber
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"
bartektartanus
sumber
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"   
Brijesh
sumber
Alat peraga untuk jawaban stringr! Terima kasih!
Neal Barsch
21

Mencoba:

require(Hmisc)
sapply(name, function(x) {
  paste(sapply(strsplit(x, ' '), capitalize), collapse=' ')
})
diliop
sumber
catatan yang Hmiscmungkin menimpa plyr's summarizefungsi seperti yang disebutkan di sini: stackoverflow.com/a/35324305/288875
Andre Holzner
2
@AndreHolzner Atau sebaliknya. Hmiscsedikit lebih tua dari plyr...
Joris Meys
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"
Mengejar
sumber
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!"
Beladau
sumber
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))
greg L
sumber
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

Taz
sumber
2

Ini memberi Huruf kapital untuk semua kata-kata utama

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