İki kelimeden oluşan bir dizede her iki kelimenin ilk harfini büyük yaz


174

Diyelim ki iki kelimeden oluşan bir dizem var ve ikisinden de büyük harf kullanmak istiyorum.

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

HmiscPaket işlevi vardır capitalizeilk kelimeyi büyük harfle, ama ben büyük harfle ikinci kelime nasıl emin değilim. İçin yardım sayfası, capitalizebu görevi gerçekleştirebileceğini göstermez.

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

Elde etmek istiyorum:

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

Üç kelimelik dizelere ne dersiniz:

name2 <- c("I like pizza")

Yanıtlar:


172

Büyük harf kullanımı için temel R işlevi toupper(x). Yardım dosyasından ?toupperihtiyacınız olanı yapan bu işlev vardır:

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" 

Düzenle Bu, kelime sayısına bakılmaksızın herhangi bir dize için çalışır:

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

11
Ve bu başkalarına yardımcı olursa, tolower işlevini basitCap işlevinin içine koyarak da tüm başlıklı kelimelerle başa çıkabileceğinizi unutmayın: başa çıkabileceğiniz kod: <br/> name <- c ("george wasHINgton", "tom jefferson "," ABE LINCOLN ") simpleCap <- işlev (x) {s <- tolower (x) s <- strsplit (s," ") [[1]] macun (başlık (alt dize (s, 1,1)) altdizgesi (s, 2), sep = "", çökme =" ")} sapply (isim, simpleCap)
MatthewR

Tireli isimlere ne dersiniz? Smith-Jones veya Al-Rayon gibi SMITH-JONES veya al-rayon olarak girilebilir.
Hack-R

1
Bunun paste0()yerine kullanabilirsiniz paste(..., sep=""). Sadece daha kısa.
MERose

3
@merose Doğru, ancak bu durumda değil, çünkü argümanı paste0 ()kabul etmiyorcollapse = ...
Andrie

3
@Andrie hala doğru mu? paste0(c("a", "b"), collapse = ",")benim için iyi çalışıyor. Belki de bu yeni bir özelliktir?
MichaelChirico

156

Başlık durumu için de yerleşik bir base-R çözümü vardır :

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

veya

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

3
Kaynağa biraz baktığımızda, işlevin, büyük olasılıkla İngilizce istisnalar (örn. Gibi 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")) hariç tüm kelimeleri büyük harflerle başlatmaya izin vererek başlık harfini (tüm kelimelerden büyük harfle başlayan başka bir şey) elde etmeye çalıştığını gösterir.
petermeissner

15
SADECE ilk karakterin büyük harf kullanımını bekliyorsanız şaşırabilirsiniz. tools::toTitleCase("HELLO")ile sonuçlanır HELLO. Bunu tolowerönce etrafa sarmak isteyebilirsiniz : tools::toTitleCase(tolower("HELLO"))hangi döndürürHello
ddunn801

2
iyi ppint - hala bu kadar alabilirsiniz başlık-case-ishst
petermeissner

Teşekkürler! Bu çözüm, ABD eyaletlerinin kısaltmaları dışında çoğu durum için harika çalışıyor
Tung

97

^Boşluk başında veya sonrasında başlayan [[:space:]]ve onu alfabetik bir karakter izleyen normal bir ifadeyle eşleştirin [[:alpha:]]. Genel olarak (gsub'daki g), tüm bu oluşumları eşleşen başlangıç ​​veya boşluk ve eşleşen alfabetik karakterin büyük harf sürümüyle değiştirir \\1\\U\\2. Bu perl tarzı düzenli ifade eşleme ile yapılmalıdır.

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

Değiştirme argümanı için biraz daha ayrıntılı olarak gsub(), \\1' xilk alt ifadeyi eşleştirme bölümünü kullanın ', yani xeşleştirme bölümünü kullanın(^|[[:spacde:]]) . Benzer şekilde, ikinci alt ifadeyi eşleştirme \\2kısmını kullandığını söylüyor . Kullanılarak etkin sözdizimi ve bir sonraki karakter Üst konu ederek anlamına gelir. Yani "Posta kodu" için "Posta", "kod", "Kod" ve "Posta Kodu" dur.x([[:alpha:]])\\Uperl=TRUE\\1\\2\\U\\2\\1\\U\\2

?regexpSayfa, düzenli ifadeler anlamak için yararlıdır ?gsubbirlikte bir şeyler koymak için.


12
bah! Başlangıçta bu yola düştüm, ama yanlışlıkla kullanmam \\ugerektiğini fark etmeden önce yanlışlıkla kullanıyordum ve vazgeçtim ... biraz ironik. İşte geldiğim şey, garip bir top vakalarına karşı tam olarak denetlenmedigsub(pattern = "\\b([a-z])", replacement = "\\U\\1", name, perl = TRUE)
Chase

Bunu satır isimlerinde kullanmaya çalıştım ve bir kez çalıştı ama tekrarlayamadım.
7'de dpel

tolower(name)Başka kapaklar varsa çalışır
MichaelChirico

83

Bu işlevi stringipaketten kullan

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 paketi (eğer tidyverse sizin işinizse) adlı dosyayı şu stri_tans_totitlefonksiyona sarar str_to_title(). Sadece kapakların altındaki stringi :: stri_trans_totitle (), ancak iş akışınıza bağlı olarak başka bir kitaplık yüklemeyi (özünde zaten yükleyebilirsiniz) kaydedebilir.
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"   

Stringr cevap için aksesuarlar! Teşekkürler!
Neal Barsch


16

İçin yardım sayfasından ?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 BBmiscşimdi işlevi içeriyor 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

Subring ve regexpr ile alternatif yol:

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

4

Snakecase paketini de kullanabilirsiniz:

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

Bu, tüm büyük kelimelere büyük harf verir

library(lettercase)
xString = str_title_case(xString)

Mükemmel çalışmıyor> lettercase::str_title_case("HEY HELLO") [1] "HEY HELLO"
Tung

Evet, önce tolower (x) kullanmanızı öneririm. Ayrıca 'tüm önemli kelimeleri' söylerken bir hata yaptım; bu işlev tüm kelimeler üzerinde çalışır .
Cole Davis

Başka bir seçenek: kütüphane (Hmisc) # büyük harf işlevi
Cole Davis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.