replacement regular pattern funcion r

regular - R: gsub, patrón=vector y reemplazo=vector



regular expression using r (5)

Como dice el título, estoy tratando de usar gsub donde uso un vector para el "patrón" y "reemplazo". Actualmente, tengo un código que se ve así:

names(x1) <- gsub("2110027599", "Inv1", names(x1)) #x1 is a data frame names(x1) <- gsub("2110025622", "Inv2", names(x1)) names(x1) <- gsub("2110028045", "Inv3", names(x1)) names(x1) <- gsub("2110034716", "Inv4", names(x1)) names(x1) <- gsub("2110069349", "Inv5", names(x1)) names(x1) <- gsub("2110023264", "Inv6", names(x1))

Lo que espero hacer es algo como esto:

a <- c("2110027599","2110025622","2110028045","2110034716", "2110069349", "2110023264") b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6") names(x1) <- gsub(a,b,names(x1))

Supongo que hay una función de aplicación en alguna parte que puede hacer esto, ¡pero no estoy muy seguro de cuál usar!

EDITAR: los nombres (x1) se ven así (hay muchas más columnas, pero las estoy omitiendo):

> names(x1) [1] "2110023264A.Ms.Amp" "2110023264A.Ms.Vol" "2110023264A.Ms.Watt" "2110023264A1.Ms.Amp" [5] "2110023264A2.Ms.Amp" "2110023264A3.Ms.Amp" "2110023264A4.Ms.Amp" "2110023264A5.Ms.Amp" [9] "2110023264B.Ms.Amp" "2110023264B.Ms.Vol" "2110023264B.Ms.Watt" "2110023264B1.Ms.Amp" [13] "2110023264Error" "2110023264E-Total" "2110023264GridMs.Hz" "2110023264GridMs.PhV.phsA" [17] "2110023264GridMs.PhV.phsB" "2110023264GridMs.PhV.phsC" "2110023264GridMs.TotPFPrc" "2110023264Inv.TmpLimStt" [21] "2110023264InvCtl.Stt" "2110023264Mode" "2110023264Mt.TotOpTmh" "2110023264Mt.TotTmh" [25] "2110023264Op.EvtCntUsr" "2110023264Op.EvtNo" "2110023264Op.GriSwStt" "2110023264Op.TmsRmg" [29] "2110023264Pac" "2110023264PlntCtl.Stt" "2110023264Serial Number" "2110025622A.Ms.Amp" [33] "2110025622A.Ms.Vol" "2110025622A.Ms.Watt" "2110025622A1.Ms.Amp" "2110025622A2.Ms.Amp" [37] "2110025622A3.Ms.Amp" "2110025622A4.Ms.Amp" "2110025622A5.Ms.Amp" "2110025622B.Ms.Amp" [41] "2110025622B.Ms.Vol" "2110025622B.Ms.Watt" "2110025622B1.Ms.Amp" "2110025622Error" [45] "2110025622E-Total" "2110025622GridMs.Hz" "2110025622GridMs.PhV.phsA" "2110025622GridMs.PhV.phsB"

Lo que espero obtener es esto:

> names(x1) [1] "Inv6A.Ms.Amp" "Inv6A.Ms.Vol" "Inv6A.Ms.Watt" "Inv6A1.Ms.Amp" "Inv6A2.Ms.Amp" [6] "Inv6A3.Ms.Amp" "Inv6A4.Ms.Amp" "Inv6A5.Ms.Amp" "Inv6B.Ms.Amp" "Inv6B.Ms.Vol" [11] "Inv6B.Ms.Watt" "Inv6B1.Ms.Amp" "Inv6Error" "Inv6E-Total" "Inv6GridMs.Hz" [16] "Inv6GridMs.PhV.phsA" "Inv6GridMs.PhV.phsB" "Inv6GridMs.PhV.phsC" "Inv6GridMs.TotPFPrc" "Inv6Inv.TmpLimStt" [21] "Inv6InvCtl.Stt" "Inv6Mode" "Inv6Mt.TotOpTmh" "Inv6Mt.TotTmh" "Inv6Op.EvtCntUsr" [26] "Inv6Op.EvtNo" "Inv6Op.GriSwStt" "Inv6Op.TmsRmg" "Inv6Pac" "Inv6PlntCtl.Stt" [31] "Inv6Serial Number" "Inv2A.Ms.Amp" "Inv2A.Ms.Vol" "Inv2A.Ms.Watt" "Inv2A1.Ms.Amp" [36] "Inv2A2.Ms.Amp" "Inv2A3.Ms.Amp" "Inv2A4.Ms.Amp" "Inv2A5.Ms.Amp" "Inv2B.Ms.Amp" [41] "Inv2B.Ms.Vol" "Inv2B.Ms.Watt" "Inv2B1.Ms.Amp" "Inv2Error" "Inv2E-Total" [46] "Inv2GridMs.Hz" "Inv2GridMs.PhV.phsA" "Inv2GridMs.PhV.phsB"


Nueva respuesta

Si podemos hacer otra suposición, lo siguiente debería funcionar. La suposición de esta vez es que está realmente interesado en sustituir los primeros 10 caracteres de cada valor en names(x1) .

Aquí, he almacenado names(x1) como un vector de caracteres llamado "X1". La solución utiliza esencialmente substr para separar los valores en X1 en 2 partes, match para descubrir la opción de reemplazo correcta y paste para volver a juntar todo.

a <- c("2110027599", "2110025622", "2110028045", "2110034716", "2110069349", "2110023264") b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6") X1pre <- substr(X1, 1, 10) X1post <- substr(X1, 11, max(nchar(X1))) paste0(b[match(X1pre, a)], X1post) # [1] "Inv6A.Ms.Amp" "Inv6A.Ms.Vol" "Inv6A.Ms.Watt" # [4] "Inv6A1.Ms.Amp" "Inv6A2.Ms.Amp" "Inv6A3.Ms.Amp" # [7] "Inv6A4.Ms.Amp" "Inv6A5.Ms.Amp" "Inv6B.Ms.Amp" # [10] "Inv6B.Ms.Vol" "Inv6B.Ms.Watt" "Inv6B1.Ms.Amp" # [13] "Inv6Error" "Inv6E-Total" "Inv6GridMs.Hz" # [16] "Inv6GridMs.PhV.phsA" "Inv6GridMs.PhV.phsB" "Inv6GridMs.PhV.phsC" # [19] "Inv6GridMs.TotPFPrc" "Inv6Inv.TmpLimStt" "Inv6InvCtl.Stt" # [22] "Inv6Mode" "Inv6Mt.TotOpTmh" "Inv6Mt.TotTmh" # [25] "Inv6Op.EvtCntUsr" "Inv6Op.EvtNo" "Inv6Op.GriSwStt" # [28] "Inv6Op.TmsRmg" "Inv6Pac" "Inv6PlntCtl.Stt" # [31] "Inv6Serial Number" "Inv2A.Ms.Amp" "Inv2A.Ms.Vol" # [34] "Inv2A.Ms.Watt" "Inv2A1.Ms.Amp" "Inv2A2.Ms.Amp" # [37] "Inv2A3.Ms.Amp" "Inv2A4.Ms.Amp" "Inv2A5.Ms.Amp" # [40] "Inv2B.Ms.Amp" "Inv2B.Ms.Vol" "Inv2B.Ms.Watt" # [43] "Inv2B1.Ms.Amp" "Inv2Error" "Inv2E-Total" # [46] "Inv2GridMs.Hz" "Inv2GridMs.PhV.phsA" "Inv2GridMs.PhV.phsB"

Vieja respuesta

Si podemos suponer que los names(x1) están en el mismo orden que el patrón y el reemplazo y que básicamente se trata de un reemplazo de uno por uno, es posible que pueda salirse con la sapply simplemente.

Aquí hay un ejemplo de esa situación particular:

Imagine "nombres (x)" se ve algo como esto:

X1 <- paste0("A2", a, sequence(length(a))) X1 # [1] "A221100275991" "A221100256222" "A221100280453" # [4] "A221100347164" "A221100693495" "A221100232646"

Aquí está nuestro pattern y vectores de replacement :

a <- c("2110027599", "2110025622", "2110028045", "2110034716", "2110069349", "2110023264") b <- c("Inv1","Inv2","Inv3","Inv4","Inv5","Inv6")

Esta es la forma en que podríamos usar sapply si estas suposiciones son válidas.

sapply(seq_along(a), function(x) gsub(a[x], b[x], X1[x])) # [1] "A2Inv11" "A2Inv22" "A2Inv33" "A2Inv44" "A2Inv55" "A2Inv66"


De alguna manera, los names<- y el match parece mucho más apropiado aquí ...

names( x1 ) <- b[ match( names( x1 ) , a ) ]

Pero estoy asumiendo que los elementos del vector a son los names reales de su data.frame .

Si realmente se encuentra un patrón dentro de cada uno de los names de x1 , este enfoque de grepl con names<- podría ser útil ...

new <- sapply( a , grepl , x = names( x1 ) ) names( x1 ) <- b[ apply( new , 1 , which.max ) ]


De la documentación del stringr de str_replace_all , "Si desea aplicar múltiples patrones y reemplazos a la misma cadena, pase una versión nombrada al patrón".

Por lo tanto, usando a, b, y nombres (x1) desde arriba

library(stringr) names(b) <- a str_replace_all(names(x1), b)


Muchas soluciones, aquí hay una más:

El paquete qdap:

library(qdap) names(x1) <- mgsub(a,b,names(x1))


Pruebe mapply .

names(x1) <- mapply(gsub, a, b, names(x1), USE.NAMES = FALSE)

O, incluso más fácil, str_replace from stringr .

library(stringr) names(x1) <- str_replace(names(x1), a, b)