2015-09-24 17 views
5

Ben (insan) isimler, başkentlerinde tüm bir vektör var:Decapitalize insan isimleri (için 've muhasebe -)

names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN") 

decapitalize şimdiye kadar (sadece ilk harfleri büyük) için, ben oldu

simpleDecap <- function(x) { 
    s <- strsplit(x, " ")[[1]] 
    paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=" ") 
    } 
sapply(names, simpleDecap, USE.NAMES=FALSE) 
# [1] "Friedrich Schiller"   "Frank O'hara"   "Hans-christian Andersen" 

kullanarak Ama aynı zamanda ' ve - için hesaba istiyorum. s <- strsplit(x, " |\\'|\\-")[[1]]'u kullanarak doğru harfleri bulur, ancak sonra da ' ve - daraltılır.

sapply(names, simpleDecap2, USE.NAMES=FALSE) 
# [1] "Friedrich schiller"  "Frank o'Hara"   "Hans-christian andersen" 
: Dolayısıyla, ben

simpleDecap2 <- function(x) { 
    for (char in c(" ", "\\-", "\\'")){ 
    s <- strsplit(x, char)[[1]] 
    x <-paste0(substring(s, 1,1), tolower(substring(s, 2)), collapse=char) 
    } return x 
    } 

sapply (isimleri, simpleDecap, USE.NAMES = YANLIŞ)

fakat sonuçlar birbiri ardına bölünmüş olarak, elbette, daha da kötü çalıştı

Doğru yaklaşımın s <- strsplit(x, " |\\'|\\-")[[1]]'a göre ayrıldığını düşünüyorum, ancak paste= problem.

cevap

6

Bu Perl uyumlu düzenli ifadeler kullanarak, iş gibi görünüyor:

gsub("\\b(\\w)([\\w]+)", "\\1\\L\\2", names, perl = TRUE) 

\L harfe şu maç grubunu dönüştürür.

+1

özlü * ve * anlaşılmazlığı seviyorum perl-regexp :-) –

+0

@CarlWitthoft Gerçekten buna katılmıyorum. Başka bir dil gibi, onlar da öğrenilmeli, ama ifade ettikleri için çok basit ve anlaşılabilir. Normal ifadenin anlaşılamaz olduğu genel iddiası devasa bir kanundur: eşdeğer, elle ayrıştırma kodu neredeyse her zaman daha karmaşıktır ve anlaşılması daha zordur. Bunun için “anlaşılmaz” kelimesini kullanmak gerçekten yanıltıcıdır. –

+1

Bu, perl'in kendisi tarafından gizlenmiş bir c-kodu yarışmasıyla soluklaşan programlama stiline izin veren mizahi bir kazıdır. Elbette regex, * dizgi manipülasyonu için gitmenin yolu. –

0

Perl regexp'in daha iyi bir çözüm olduğuna katılıyorum, ancak simpleDecap2 yaklaşımı çalışmadan çok uzak değil. olduğu

simpleDecap3 <- function(x) { 
    x <- tolower(x) 
    for (char in c(" ", "-", "'")){ 
     s <- strsplit(x, char)[[1]] 
     x <-paste0(toupper(substring(s, 1,1)), substring(s, 2), collapse=char) 
    } 
    x 
} 

, küçük harf bütün adını açmak ve ardından "", "sonra ilk harfini büyük -" veya "'". Regexp kadar güzel değil ve büyük olasılıkla sağlam değil, ama orijinal kodunuzdaki küçük değişiklikler ile işi tamamlıyor.

+0

Bu yalnızca ilk değeri döndürür. –

+0

Evet, "SimpleDecap2" ile aynı biçime sahip, bunu "sapply (adlar, simpleDecap3, USE.NAMES = FALSE)" gibi çağırmanız gerekiyor. – DGKarlsson

İlgili konular