Мы могли бы использовать обратный поиск с отрицательным регулярным выражением, чтобы сопоставить буквы верхнего регистра, которые не следуют за ,
и пробелом
, захватить как группу ((...)
), в замене указать обратную ссылку захваченной группы (\\1
, \\2
) при преобразовании второй группы в более низкую (\\L
)
gsub("(?<!, )([A-Z])([A-Z]+)\\b", "\\1\\L\\2", str1, perl = TRUE)
#[1] "New York, NY" "Washington, DC" "Amherst, MA" "Hanover, NH"
#[5] "Davidson, NC" "Brunswick, ME"
#[7] "Greenville, SC" "Portland, OR" "Louisville, KY"
data
str1 <- c("NEW YORK, NY", "WASHINGTON, DC", "AMHERST, MA", "HANOVER, NH",
"DAVIDSON, NC", "BRUNSWICK, ME", "GREENVILLE, SC", "PORTLAND, OR",
"LOUISVILLE, KY")