R: Занимать все после определенного персонажа
Я хотел бы использовать все символы вектора символов, которые появляются после первого _
. Например, следующий вектор:
x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f")
Должно получиться так:
"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"
Я пытался играть с регулярными выражениями, но я не могу этого сделать. Мы ценим любые предложения.
Ответы
Ответ 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"