ใช้ตัวพิมพ์ใหญ่สำหรับอักษรตัวแรกของทั้งสองคำในสตริงสองคำ


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

สิ่งที่เกี่ยวกับสายสามคำ:

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
และถ้าเป็นประโยชน์กับคนอื่น ๆ อย่าลืมจำไว้ด้วยการใส่ฟังก์ชั่น tolower ไว้ในฟังก์ชั่น simpleCap ของคุณคุณสามารถจัดการกับคำที่ต่อท้ายได้ทั้งหมด: คือรหัสที่คุณสามารถจัดการได้: <br/> ชื่อ <- c ("george wasHINgton", "tom jefferson "," ABE LINCOLN ") simpleCap <- ฟังก์ชั่น (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] วาง (toupper (ซับสตริง (s, 1,1)) , substring (s, 2), sep = "", ยุบ = "")} sapply (ชื่อ, simpleCap)
MatthewR

ชื่อที่ใส่ยัติภังค์เป็นอย่างไร? เช่น Smith-Jones หรือ Al-Rayon ซึ่งสามารถป้อนเป็น SMITH-JONES หรือ al-rayon
Hack-R

1
คุณสามารถใช้แทนpaste0() paste(..., sep="")สั้นลง
ลดขนาด

3
@ แก้ไขให้ถูกต้อง แต่ไม่ใช่ในกรณีนี้เนื่องจากpaste0 ()ไม่ยอมรับการcollapse = ...โต้แย้ง
Andrie

3
@Andrie นั้นถูกต้องหรือยัง paste0(c("a", "b"), collapse = ",")ทำงานได้ดีสำหรับฉัน บางทีนี่อาจเป็นคุณสมบัติล่าสุด
MichaelChirico

156

มีโซลูชัน base-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 ที่ดี - ยังคงเป็นเรื่องของ case-ishst ที่คุณจะได้รับจนถึงตอนนี้
petermeissner

ขอบคุณ! วิธีนี้ใช้ได้ผลดีสำหรับกรณีส่วนใหญ่ยกเว้นเมื่อมีตัวย่อของรัฐสหรัฐอเมริกา
ตุง

97

ตรงกับการแสดงออกปกติที่จะเริ่มต้นที่จุดเริ่มต้น^หรือหลังพื้นที่และตามด้วยตัวอักษรตัวอักษร[[:space:]] [[:alpha:]]ทั่วโลก (g ใน gsub) \\1\\U\\2แทนที่เกิดขึ้นดังกล่าวทั้งหมดที่มีจุดเริ่มต้นที่ตรงกันหรือพื้นที่และรุ่นบนกรณีของตัวละครตัวอักษรจับคู่ สิ่งนี้จะต้องทำด้วยการจับคู่การแสดงออกปกติสไตล์ Perl

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

ในรายละเอียดเล็ก ๆ น้อย ๆ สำหรับอาร์กิวเมนต์ทดแทนgsub(), \\1กล่าวว่า 'ใช้เป็นส่วนหนึ่งของxการจับคู่ครั้งแรกย่อยแสดงออก' คือส่วนหนึ่งของการจับคู่x (^|[[:spacde:]])ในทำนองเดียวกัน\\2ว่าใช้เป็นส่วนหนึ่งของการจับคู่ที่สองย่อยแสดงออกx ไวยากรณ์ที่เปิดใช้งานโดยการใช้และวิธีการที่จะทำให้ตัวอักษรถัดไปบนกรณี ดังนั้นสำหรับ "รหัสไปรษณีย์" คือ "รหัสไปรษณีย์" คือ "รหัส" คือ "รหัส" และ"รหัสไปรษณีย์"([[:alpha:]])\\Uperl=TRUE\\1\\2\\U\\2\\1\\U\\2

?regexpหน้าจะเป็นประโยชน์สำหรับการแสดงออกปกติความเข้าใจ?gsubสำหรับการวางสิ่งที่ร่วมกัน


12
Bah! ฉันไปตามเส้นทางนี้ แต่เดิมใช้ผิด\\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
แพคเกจ stringr (ถ้า tidyverse คือสิ่งที่คุณ) ห่อเข้าสู่ฟังก์ชั่นที่มีชื่อว่า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"   

อุปกรณ์ประกอบฉากสำหรับคำตอบ stringr! ขอบคุณ!
Neal Barsch

21

ลอง:

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

ทราบว่าHmiscอาจแทนที่plyrของsummarizeฟังก์ชั่นเป็นที่กล่าวถึงที่นี่: stackoverflow.com/a/35324305/288875
อังเดร Holzner

2
@AndreHolzner หรือวิธีอื่น ๆ Hmiscค่อนข้างเก่ากว่าplyr...
Joris Meys

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"



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"
ตุง

ใช่ฉันอยากจะแนะนำให้ใช้ tolower (x) ก่อน นอกจากนี้ฉันทำผิดพลาดในการพูด 'คำสำคัญทั้งหมด'; ฟังก์ชั่นนี้ใช้ได้กับทุกคำ
โคลเดวิส

ตัวเลือกอื่น: library (Hmisc) # capitalize function
Cole Davis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.