Р: Использование заглавных букв после определенного символа

Я хотел бы использовать для своей выгоды все в символьном векторе, который идет после первого _, Например, следующий вектор:

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f") 

Должно получиться так:

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

Я пытался играть с регулярными выражениями, но не могу этого сделать. Мы ценим любые предложения.

3 ответа

Решение

Вы были очень близки

gsub("(_.*)","\\U\\1",x,perl=TRUE)

похоже на работу. Вам просто нужно было использовать _.* (подчеркивание, за которым следует ноль или более других символов), а не _* (ноль или более подчеркиваний) ...

Чтобы разобрать это немного больше:

  • _.* дает шаблон регулярного выражения, который соответствует подчеркиванию _ за которым следует любое количество (включая 0) дополнительных символов; . обозначает "любой символ" и * обозначает "ноль или более повторов предыдущего элемента"
  • окружая это регулярное выражение круглыми скобками () обозначает, что это шаблон, который мы хотим сохранить
  • \\1 в строке замены написано "вставить содержимое первого сопоставленного шаблона", т.е. _.*
  • \\U, в сочетании с perl=TRUE, говорит "поставить то, что следует в верхнем регистре" (верхний регистр _ не имеет никакого эффекта; если бы мы хотели использовать заглавные буквы после (например) строчной буквы g, нам нужно было бы исключить g из сохраненного шаблона и включить его в шаблон замены: gsub("g(.*)","g\\U\\1",x,perl=TRUE))

Для получения более подробной информации, искать "замена" и "капитализация" в ?gsub (а также ?regexp для общей информации о регулярных выражениях)

gsubfn в пакете gsubfn это как gsub кроме строки замены может быть функция. Здесь мы сопоставляем _ и все, что потом пропускаем через матч toupper:

> library(gsubfn)
>
> gsubfn("_.*", toupper, x)
[1] "NYC_23DF"  "BOS_3_RB"  "mgh_3_3_F"

Обратите внимание, что этот подход включает в себя особенно простое регулярное выражение.

Простой пример использования base::strsplit

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f", "a") 

myCap <- function(x) {
    out <- sapply(x, function(y) {
        temp <- unlist(strsplit(y, "_"))
        out <- temp[1]
        if (length(temp[-1])) {
            out <- paste(temp[1], paste(toupper(temp[-1]), 
                collapse="_"), sep="_") 
        }
        return(out)
    })
    out
}

> myCap(x)
   NYC_23df    BOS_3_rb   mgh_3_3_f           a 
 "NYC_23DF"  "BOS_3_RB" "mgh_3_3_F"         "a" 

Пример использования пакета stringr

pkg <- "stringr"
if (!require(pkg, character.only=TRUE)) {
    install.packages(pkg)
    require(pkg, character.only=TRUE)   
}

myCap.2 <- function(x) {
    out <- sapply(x, function(y) {
        idx <- str_locate(y, "_")
        if (!all(is.na(idx[1,]))) {
            str_sub(y, idx[,1], nchar(y)) <- toupper(str_sub(y, idx[,1], nchar(y))) 
        }
        return(y)
    })
    out
}

> myCap.2(x)
   NYC_23df    BOS_3_rb   mgh_3_3_f           a 
 "NYC_23DF"  "BOS_3_RB" "mgh_3_3_F"         "a" 
Другие вопросы по тегам