Как заменить строчную букву после дефиса на ее прописную

В моем фрейме данных у меня есть столбец с фамилиями членов парламента в нижнем регистре. Я заменил первую букву в верхнем регистре на (из этого ответа):

# vector with names
lastname <- c("wortmann-kool", "mulder", "nistelrooij", "camp", "schaake", "veld", "lange", "oomen-ruijten")
# substituting first letter with uppercase
lastname <- gsub("^(\\w)(\\w+)", "\\U\\1\\L\\2", lastname, perl = TRUE)

Как видите, в некоторых именах есть дефис для разделения двух имен замужних женщин. Как заменить первую букву после дефиса на заглавную?


person Jaap    schedule 04.05.2014    source источник
comment
это должно быть в одном gsub? gsub("-([a-z])", "-\\U\\1", gsub("^(\\w)(\\w+)", "\\U\\1\\L\\2", lastname, perl = TRUE))   -  person hrbrmstr    schedule 04.05.2014


Ответы (2)


Почему бы просто не прописать первую букву после границы слова?

> lastname <- c("wortmann-kool", "mulder", "nistelrooij", "camp", "schaake", "veld", "lange", "oomen-ruijten")
> gsub("\\b(\\w)", "\\U\\1", lastname, perl = TRUE)
[1] "Wortmann-Kool" "Mulder"        "Nistelrooij"   "Camp"         
[5] "Schaake"       "Veld"          "Lange"         "Oomen-Ruijten"
> 

Цитата из документации:

Только для perl = TRUE он также может содержать "\U" или "\L" для преобразования остальной части замены в верхний или нижний регистр и "\E" для преобразования в конце регистра.

## capitalizing
txt <- "a test of capitalizing"
gsub("(\\w)(\\w*)", "\\U\\1\\L\\2", txt, perl=TRUE)
gsub("\\b(\\w)",    "\\U\\1",       txt, perl=TRUE)
person devnull    schedule 04.05.2014
comment
Upvoting для компактного и эффективного. :) - person zx81; 05.05.2014
comment
Очень хорошо. Эта опция задокументирована где-то в R, или "\\U" в верхнем регистре взято из библиотеки PCRE и задокументировано где-то в ее документах, но не в R? - person Josh O'Brien; 05.05.2014
comment
@JoshO'Brien Это документация, возможно, не в самом удобочитаемом виде. Добавлены соответствующие фрагменты из документов в ответ. - person devnull; 05.05.2014

Это будет работать для любых знаков препинания, которые вы могли бы там иметь.

gsub("(^|[[:punct:]])([[:alpha:]])", "\\1\\U\\2", lastname, perl=TRUE)

##[1] "Wortmann-Kool" "Mulder"        "Nistelrooij"   "Camp"         
##[5] "Schaake"       "Veld"          "Lange"         "Oomen-Ruijten"

Это будет работать только для дефисов

gsub("(^|-)([[:alpha:]])", "\\1\\U\\2", lastname, perl=TRUE)

##[1] "Wortmann-Kool" "Mulder"        "Nistelrooij"   "Camp"         
##[5] "Schaake"       "Veld"          "Lange"         "Oomen-Ruijten"
person David Arenburg    schedule 04.05.2014