regex - sheet - stringr r
R: Capitalizar todo después de un cierto personaje (3)
Me gustaría capitalizar todo en un vector de caracteres que viene después de la primera _
. Por ejemplo el siguiente vector:
x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f")
Debería salir así:
"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"
He intentado jugar con expresiones regulares , pero no puedo hacer esto. Cualquier sugerencia sera apreciada.
Ejemplo simple usando 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"
Ejemplo usando el paquete 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"
Estuviste muy cerca:
gsub("(_.*)","//U//1",x,perl=TRUE)
parece funcionar. Solo necesitaba usar _.*
(Guión bajo seguido de cero o más caracteres) en lugar de _*
(cero o más guiones bajos) ...
Para desarmar esto un poco más:
-
_.*
proporciona un patrón de expresión regular que coincide con un guión bajo_
seguido de cualquier número (incluido 0) de caracteres adicionales;.
denota "cualquier carácter" y*
denota "cero o más repeticiones del elemento anterior" - rodeando esta expresión regular con paréntesis
()
denota que es un patrón que queremos almacenar -
//1
en la cadena de reemplazo dice "inserta el contenido del primer patrón coincidente", es decir, lo que sea_.*
-
//U
, junto conperl=TRUE
, dice "poner lo que sigue en mayúsculas" (mayúsculas_
no tiene ningún efecto; si quisiéramos capitalizar todo después de (por ejemplo) una g minúscula, tendríamos que excluir la g a partir del patrón almacenado e incluirlo en el patrón de reemplazo:gsub("g(.*)","g//U//1",x,perl=TRUE)
)
Para más detalles, busque "reemplazo" y "capitalizando" en ?gsub
(y ?regexp
para obtener información general sobre expresiones regulares)
gsubfn
en el paquete gsubfn es como gsub
excepto que la cadena de reemplazo puede ser una función. Aquí coincidimos _ y todo después alimentamos el partido a través de toupper
:
> library(gsubfn)
>
> gsubfn("_.*", toupper, x)
[1] "NYC_23DF" "BOS_3_RB" "mgh_3_3_F"
Tenga en cuenta que este enfoque implica una expresión regular particularmente simple.