R: Занимать все после определенного персонажа - программирование
Подтвердить что ты не робот

R: Занимать все после определенного персонажа

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

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

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

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

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

4b9b3361

Ответ 1

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

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

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

Разделить это немного больше:

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

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

Ответ 2

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

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

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

Ответ 3

Простой пример с использованием 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 package

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"